Shell變量

第一個Shell腳本

建立一個文件,以.sh做爲擴展名(注意Linux是沒有擴展名這個概念的,能夠隨意取.s或者.甚至能夠沒有擴展名),這裏取.sh是爲了咱們好識別這是個Shell腳本。bash

這裏我在你本身想要存放文件的目錄下建立一個Shell腳本,命名爲first.shless

在默認的vi編輯器中,第一行輸入以下代碼:編輯器

第一行開頭"#!"是一個約定的標記,特別重要,它告訴系統這個腳本須要什麼解釋器來執行,即哪種Shell函數

第二句 echo命令後面加了字符串,表示在打印後面的字符串。再保存,退出。工具

怎麼執行咱們剛建立好的腳本呢?oop

chmod +x ./first.sh  #使腳本具備執行權限
./first.sh  #執行腳本,注意不能有空格

或者直接:測試

 sh first.sh  #注意在當前路徑執行,不然寫絕對路徑 

定義變量

在Shell腳本中變量名的幾個要求:spa

  • 首個字符必須爲字母(a-z,A-Z)。
  • 中間不能有空格,可使用下劃線(_)。
  • 不能使用標點符號。
  • 不能使用 bash 裏的關鍵字(可用 help 命令查看保留關鍵字)。 

特別注意變量名和等號之間不能有空格命令行

//正確:
myName="Jim"

//錯誤:
myName = "Jim"

在定義變量的時候,直接能夠左邊變量名,右邊爲值,中間用等號鏈接,在強調一遍(等號兩邊不能有空格unix

 定義變量舉例:

stu_name="Jack"

stu_Num=12

咱們怎麼使用變量呢?在使用的時候,咱們用$變量名,就能夠輸出對應得值

name="Jim"
echo $name

可是咱們最好在變量名先後加{},形式爲:${變量名}

name="Jim"
echo ${name}

這樣有幾個好處,一是便於咱們很直觀的看出這是變量,還有一種狀況就是看代碼:

language="Java"
echo "I like $languageScript"

結果會輸出: I like JavaScript 嗎?會嗎?系統很能智能的識別到language是變量嗎?

你能夠試試就知道了,不過我敢保證,下面這樣確定能夠:

language="Java"
echo "I like ${language}Script"

結果:

對吧,這樣系統能夠很好的識別到大括號括起來的是變量。

變量從新賦值

language="Java"
language="Shell"
echo "I like ${language}Script"

只讀變量

readonly  變量名 

這樣變量就是隻讀,不能修改了

刪除變量

unset  變量名 

刪除後,結果輸出就爲空:

特殊變量

變量 含義
$0 當前腳本的文件名
$n 傳遞給腳本或函數的參數。n 是一個數字,表示第幾個參數。例如,第一個參數是$1,第二個參數是$2。
$# 傳遞給腳本或函數的參數個數。
$* 傳遞給腳本或函數的全部參數。
$@ 傳遞給腳本或函數的全部參數。被雙引號(" ")包含時,與 $* 稍有不一樣,下面將會講到。
$? 上個命令的退出狀態,或函數的返回值。
$$ 當前 Shell 進程 ID。對於 Shell 腳本,就是這些腳本所在的進程 ID。

 

 

 

 

 

 

例如:查看點Shell進程的ID

echo $$

 

命令行參數

運行腳本時,傳遞給腳本的參數爲命令行參數,例若有如下腳本:

#!/bin/bash
echo "當前Shell進程的ID爲:$$"
echo "文件名稱:$0"
echo "文件的第一個參數:$1"
echo "文件的第二個1參數:$2"
echo "傳遞給腳本的參數個數:$#"
echo "傳遞給腳本或函數的全部參數:$*"

運行結果:

$* 和 $@ 的區別

#!/bin/bash
echo "當前Shell進程的ID爲:$$"
echo "文件名稱:$0"
echo "文件的第一個參數:$1"
echo "文件的第二個1參數:$2"
echo "傳遞給腳本的參數個數:$#"
echo "傳遞給腳本或函數的全部參數:$*"
echo "\$*=" $*
echo "\"\$*\"=" "$*"

echo "\$@=" $@
echo "\"\$@\"=" "$@"

echo "print each param from \$*"
for var in $*
do
    echo "$var"
done

echo "print each param from \$@"
for var in $@
do
    echo "$var"
done

echo "print each param from \"\$*\""
for var in "$*"
do
    echo "$var"
done

echo "print each param from \"\$@\""
for var in "$@"
do
    echo "$var"
done

執行結果:

Shell替換

 比較下面兩條語句輸出的不一樣點:

a=10
//此處帶參數-e
eco -e  "Value od a is ${a} \n"

//此處不帶參數
echo "Value of a is ${a} \n"

結果比較:

這裏帶參數 -e表示對轉義字符進行替換,"\n"表明換行,

相應的其餘轉義字符以下:

 

轉義字符 含義
\|反斜槓
\a 警報,響鈴

\b

退格(刪除鍵)
\f 換頁(FF),將當前位置移到下頁開頭
\n 換行
\r 回車
\t 水平製表符(tab 鍵)
\v 垂直製表符

 

命令替換 

命令替換是指Shell能夠先執行命令,將輸出結果暫時保存,在適當的地方輸出。

命令替換的語法:command注意是反引號,就是esc鍵下面這個位置

例如:

DATE=`date`
echo "Date is ${DATE}"

這裏意思是先執行date這個命令。結果爲今天的時間,而後將時間賦值給變量DATE,最後輸出變量的值。

UP=·date,uptime·
echo "Uptime is ${UP}"

結果:

變量替換

變量替換就是能夠根據變量的狀態(是否爲空 、是否認義等)來改變它的值

咱們先來個例子感覺下:

echo your name is ${name:-"your name is not set"}

:-表明若是變量爲空或者已經被刪除,就輸出後面的值,像這樣的例子以下表所示:

形式 說明
${var} 變量原本的值
${var:-word} 若是變量 var 爲空或已被刪除(unset),那麼返回 word,但不改變 var 的值
${var:=word} 若是變量 var 爲空或已被刪除(unset),那麼返回 word,並將 var 的值設置爲 word。
${var:?message} 若是變量 var 爲空或已被刪除(unset),那麼將消息 message 送到標 準錯誤輸出,能夠用來檢測變量 var 是否能夠被正常賦值。若此替換出如今 Shell 腳本中,那麼腳本將中止運行。
${var:+word} 若是變量 var 被定義,那麼返回 word,但不改變 var 的值。

 

Shell運算符

Bash 支持不少運算符,包括算數運算符、關係運算符、布爾運算符、字符串運算符和文件測試運算符。

原生 bash 不支持簡單的數學運算,可是能夠經過其餘命令來實現,例如 awk 和 expr,expr 最經常使用。

expr 是一款表達式計算工具,使用它能完成表達式的求值操做。

不信?咱們先來看這是什麼結果:

echo 2+3

會輸出5嗎? 不會!!!沒有Python那麼高端,

那麼能夠利用計算器expr來計算:

expr 2 + 3 #注意這裏2 + 2 空格,等號兩邊必定要有空格

那麼,咱們能夠用剛纔學的命令替換,來進行計算

var=·expr 2 - 5·
echo ${var}

計算器相關的用法能夠用 man expr命令來查看

運算符 說明 舉例
+ 加法 `expr $a + $b` 結果爲?30。
- 減法 `expr $a - $b` 結果爲 10。
* 乘法 `expr $a \* $b` 結果爲 ?200。
/ 除法 `expr $b / $a` 結果爲?2。
% 取餘 `expr $b % $a` 結果爲?0。
= 賦值 a=$b 將把變量 b 的值賦給 a。
== 相等。用於比較兩個數字,相同則返回 true。 [ $a == $b ] 返回?false。
!= 不相等。用於比較兩個數字,不相同則返回 true。 [ $a != $b ] 返回 true。

 

 

 

 

 

 

 

注意:條件表達式要放在方括號之間,而且要有空格,例如 [$a==$b] 是錯誤的,必須寫成 [ $a == $b ]。

關係運算符

關係運算符只支持數字,不支持字符串,除非字符串的值是數字。

運算符 說明 舉例
-eq 檢測兩個數是否相等,相等返回 true。 [ $a -eq $b ] 返回?true。
-ne 檢測兩個數是否相等,不相等返回 true。 [ $a -ne $b ] 返回 true。
-gt 檢測左邊的數是否大於右邊的,若是是,則返回 true。 [ $a -gt $b ] 返回 false。
-lt 檢測左邊的數是否小於右邊的,若是是,則返回 true。 [ $a -lt $b ] 返回 true。
-ge 檢測左邊的數是否大等於右邊的,若是是,則返回 true。 [ $a -ge $b ] 返回 false。
-le 檢測左邊的數是否小於等於右邊的,若是是,則返回 true。 [ $a -le $b ] 返回 true。

 

 

 

 

 

 

例如:

#!/bin/sh

a=10
b=20
if [ $a -eq $b ]
then
   echo "$a -eq $b : a is equal to b"
else
   echo "$a -eq $b: a is not equal to b"
fi

if [ $a -ne $b ]
then
   echo "$a -ne $b: a is not equal to b"
else
   echo "$a -ne $b : a is equal to b"
fi

if [ $a -gt $b ]
then
   echo "$a -gt $b: a is greater than b"
else
   echo "$a -gt $b: a is not greater than b"
fi

if [ $a -lt $b ]
then
   echo "$a -lt $b: a is less than b"
else
   echo "$a -lt $b: a is not less than b"
fi

if [ $a -ge $b ]
then
   echo "$a -ge $b: a is greater or  equal to b"
else
   echo "$a -ge $b: a is not greater or equal to b"
fi

if [ $a -le $b ]
then
   echo "$a -le $b: a is less or  equal to b"
else
   echo "$a -le $b: a is not less or equal to b"
fi

結果:

10 -eq 20: a is not equal to b
10 -ne 20: a is not equal to b
10 -gt 20: a is not greater than b
10 -lt 20: a is less than b
10 -ge 20: a is not greater or equal to b
10 -le 20: a is less or  equal to b

 布爾運算符

運算符 說明 舉例
! 非運算,表達式爲 true 則返回 false,不然返回 true。 [ ! false ] 返回 true。
-o 或運算,有一個表達式爲 true 則返回 true。 [ $a -lt 20 -o $b -gt 100 ] 返回?true。
-a 與運算,兩個表達式都爲 true 才返回 true。 [ $a -lt 20 -a $b -gt 100 ] 返回?false。

 

 

 

 

#!/bin/sh

a=10
b=20

if [ $a != $b ]
then
   echo "$a != $b : a is not equal to b"
else
   echo "$a != $b: a is equal to b"
fi

if [ $a -lt 100 -a $b -gt 15 ]
then
   echo "$a -lt 100 -a $b -gt 15 : returns true"
else
   echo "$a -lt 100 -a $b -gt 15 : returns false"
fi

if [ $a -lt 100 -o $b -gt 100 ]
then
   echo "$a -lt 100 -o $b -gt 100 : returns true"
else
   echo "$a -lt 100 -o $b -gt 100 : returns false"
fi

if [ $a -lt 5 -o $b -gt 100 ]
then
   echo "$a -lt 100 -o $b -gt 100 : returns true"
else
   echo "$a -lt 100 -o $b -gt 100 : returns false"
fi

結果:

10 != 20 : a is not equal to b
10 -lt 100 -a 20 -gt 15 : returns true
10 -lt 100 -o 20 -gt 100 : returns true
10 -lt 5 -o 20 -gt 100 : returns false

字符串運算符

運算符 說明 舉例
= 檢測兩個字符串是否相等,相等返回 true。 [ $a = $b ] 返回 false。
!= 檢測兩個字符串是否相等,不相等返回 true。 [ $a != $b ] 返回?true。
-z 檢測字符串長度是否爲0,爲0返回 true。 [ -z $a ] 返回 false。
-n 檢測字符串長度是否爲0,不爲0返回 true。 [ -z $a ] 返回 true。
str 檢測字符串是否爲空,不爲空返回 true。 [ $a ] 返回?true。

 

 

 

 

 

 

例如:

#!/bin/sh

a="abc"
b="efg"

if [ $a = $b ]
then
   echo "$a = $b : a is equal to b"
else
   echo "$a = $b: a is not equal to b"
fi

if [ $a != $b ]
then
   echo "$a != $b : a is not equal to b"
else
   echo "$a != $b: a is equal to b"
fi

if [ -z $a ]
then
   echo "-z $a : string length is zero"
else
   echo "-z $a : string length is not zero"
fi

if [ -n $a ]
then
   echo "-n $a : string length is not zero"
else
   echo "-n $a : string length is zero"
fi

if [ $a ]
then
   echo "$a : string is not empty"
else
   echo "$a : string is empty"
fi

結果:

abc = efg: a is not equal to b
abc != efg : a is not equal to b
-z abc : string length is not zero
-n abc : string length is not zero
abc : string is not empty

文件測試運算符

文件測試運算符用於檢測 Unix 文件的各類屬性。

例如,變量 file 表示文件「/var/www/tutorialspoint/unix/test.sh」,它的大小爲100字節,具備 rwx 權限。下面的代碼,將檢測該文件的各類屬性:

#!/bin/sh

file="/var/www/tutorialspoint/unix/test.sh"

if [ -r $file ]
then
   echo "File has read access"
else
   echo "File does not have read access"
fi

if [ -w $file ]
then
   echo "File has write permission"
else
   echo "File does not have write permission"
fi

if [ -x $file ]
then
   echo "File has execute permission"
else
   echo "File does not have execute permission"
fi

if [ -f $file ]
then
   echo "File is an ordinary file"
else
   echo "This is sepcial file"
fi

if [ -d $file ]
then
   echo "File is a directory"
else
   echo "This is not a directory"
fi

if [ -s $file ]
then
   echo "File size is zero"
else
   echo "File size is not zero"
fi

if [ -e $file ]
then
   echo "File exists"
else
   echo "File does not exist"
fi

結果:

File has read access
File has write permission
File has execute permission
File is an ordinary file
This is not a directory
File size is zero
File exists

文件測試運算符列表:

操做符 說明 舉例
-b file 檢測文件是不是塊設備文件,若是是,則返回 true。 [ -b $file ] 返回 false。
-c file 檢測文件是不是字符設備文件,若是是,則返回 true。 [ -b $file ] 返回?false。
-d file 檢測文件是不是目錄,若是是,則返回 true。 [ -d $file ] 返回 false。
-f file 檢測文件是不是普通文件(既不是目錄,也不是設備文件),若是是,則返回 true。 [ -f $file ] 返回?true。
-g file 檢測文件是否設置了 SGID 位,若是是,則返回 true。 [ -g $file ] 返回?false。
-k file 檢測文件是否設置了粘着位(Sticky Bit),若是是,則返回 true。 [ -k $file ] 返回?false。
-p file 檢測文件是不是具名管道,若是是,則返回 true。 [ -p $file ] 返回?false。
-u file 檢測文件是否設置了 SUID 位,若是是,則返回 true。 [ -u $file ] 返回?false。
-r file 檢測文件是否可讀,若是是,則返回 true。 [ -r $file ] 返回?true。
-w file 檢測文件是否可寫,若是是,則返回 true。 [ -w $file ] 返回?true。
-x file 檢測文件是否可執行,若是是,則返回 true。 [ -x $file ] 返回?true。
-s file 檢測文件是否爲空(文件大小是否大於0),不爲空返回 true。 [ -s $file ] 返回?true。
-e file 檢測文件(包括目錄)是否存在,若是是,則返回 true。 [ -e $file ] 返回?true。

 

 

 

 

 

 

 

 

 

獲取字符串的長度

str="Welcome To My World"
echo ${#str}   

 

提取子字符串

str="Welcome To My World"
echo ${str:1:4}

 

查找子字符串

str="runoob is a great company"
echo `expr index "$str" is`

查找"T"或"o"的位置

 

判斷字符串是否存在文件中

grep -q "Joe" t.txt && echo "OK" || echo "Error"

 

解壓.tar.gz文件

tar -zxvf  hadoop-2.6.0.tar.gz

 

打包壓縮文件【打包後以gzip壓縮成.tar.gz文件】

tar -zcvf hadoop-2.6.0.tar.gz hadoop-2.6.0
相關文章
相關標籤/搜索