本章學習內容: 1.常見符號 2.命令分隔符-分號";" 3.雙分號 ";;" 4. '單引號和"雙引號 5.`反引號和$() 6.${}和$ 7.冒號: 8.()小括弧 9.(())雙括弧 10.{}大括弧 11.[]和[[]]之間的條件測試區別 12.~波浪號 13.延時 14.變數賦值的註意 ...
本章學習內容:
- 1.常見符號
- 2.命令分隔符-分號";"
- 3.雙分號 ";;"
- 4. '單引號和"雙引號
- 5.`反引號和$()
- 6.${}和$
- 7.冒號:
- 8.()小括弧
- 9.(())雙括弧
- 10.{}大括弧
- 11.[]和[[]]之間的條件測試區別
- 12.~波浪號
- 13.延時
- 14.變數賦值的註意
1.常見符號
- $0 當前腳本的文件名
- $n 傳遞給腳本的參數n,比如$1表示第一個參數
- $# 傳遞給腳本或函數的參數個數。
- $*,$@ 傳遞給腳本或函數的所有參數
- $? 上個命令的退出狀態,或函數的返回值。
- $$ 當前Shell腳本所在的進程ID
示例:
#!/bin/bash for var in $* do echo "$var" #for迴圈列印所有參數 done
2.命令分隔符分號";"
- 作用:可以在同一行上寫兩個或兩個以上的命令
示例:
if [ "$filename" == "$1" ]; then #執行兩條命令 echo "File $filename exists.";fi
3.雙分號;;
- 作用:用在case語句,類似於C裡面的case,用來承擔break作用
shell的case語法如下所示:
case "變數" in "變數1") ... ;; #這裡的雙分號類似於break
"變數2") ... ;;
*) #匹配剩下的變數n ... ;;
esac #case結束語句
示例:
#!/bin/base variable=xyz case "$variable" in abc) echo "\$variable = abc" ;; xyz) echo "\$variable = xyz" ;; esac
列印:
4. '單引號和"雙引號
- 單引號: 將會阻止所有特殊字元的解釋,被單引號括住的內容都是普通字元串
- 雙引號: 引號包圍起來的字元串,部分特殊字元將起到它們的作用
示例:
#!/bin/bash a="this is a" b="this is b" echo '${a}' echo "${b}"
列印:
${a}
this is b
5.`反引號和$()
- 都是用來實現命令替換的,可以通過這個將命令的輸出賦值到一個變數中去
示例:
echo $(date "+ %Y/%m/%d %H:%M:%S") #運行date命令 echo `date "+ %Y/%m/%d %H:%M:%S"` #運行date命令 c=$(echo hello) #列印: c=hello
6.${}和$
- 都是變數替換,不過${}的好處在於,可以精確變數名稱(也可以實現字元串替換等,下章來學習)
比如:
A=123 echo $AB #錯誤,將列印空的一行,因為運行時預設會去找變數值AB的解釋 echo ${A}B #正常列印:123B
7.冒號:
空命令,一個什麼都不幹的命令,該命令的返回值為0(true).
示例如下:
: echo $? # 列印上個命令的返回值,為0
由於冒號的返回值為0,所以可以通過>將一個文件清空,但是不會修改該文件許可權
示例如下:
: > data.xxx #如果該文件不存在,則會創建, 與cat /dev/null >data.xxx的作用相同
8.()小括弧
8.1當用作命令組時
()會啟動一個子shell順序運行,需要註意的是, 由於()里的變數位於子shell中,並不是當前shell中,所以退出()後,變數還是不會變的
示例:
a=1 (a=2; echo "a = $a") #列印a=2 echo "a = $a" #列印a=1,說明變數a並沒有改變
8.2當用作初始化數組時
示例-遍曆數組:
arr=(1 2 3) #等價於array[0]=1 array[1]=2 array[2]=3 for(( i=0;i<${#arr[@]};i++)) do echo ${arr[i]}; done;
8.3當用作命令替換時
示例:
echo $(date "+ %Y/%m/%d %H:%M:%S") #運行date命令
9.(())雙括弧
9.1用於for迴圈時
示例:
for(( i=0;i<5;i++));do echo $i;done
9.2轉換運算進位時,可以通過(())將任意數據轉為10進位
示例:
echo $((16#ff)) #列印255
9.3 用於整數判斷時
示例:
if (("$a" < "$b")) if (("$a" <= "$b")) if (("$a" > "$b")) if (("$a" >= "$b"))
10.{}大括弧
10.1當用做代碼塊時
像一個匿名函數,但是{}里的變數對其它代碼來說是可見的, 並且不會開啟新的子shell
示例1:
a=1 { a=2 echo "a = $a" #列印a=2 } echo "a = $a" #列印a=2,說明已被修改
示例2-寫入文件:
#!/bin/bash { echo 'hello' echo 'this is test file' echo 'end' } > ./test
效果:
10.2當用做遍歷時
示例:
echo {1..10} #列印1 2 3 4 5 6 7 8 9 10 for var in {a..z} do echo $var #列印a~z字母 done
10.3也可以用作字元變數截取替換時
未完待續,在下一章將學習.
11.[ ]和[[]]之間的條件測試區別
11.1 [ ]的參數有以下幾種
- -z: 判斷字元串長度為0則為真
- -n: 判斷字元串長度非0則為真
- -o: 或
- -a: 與
- -x: 可執行
- -r: 可讀
- -w: 可寫
11.2當用作文件判斷時,有以下幾種參數:
- -e filename :如果 filename存在,則為真
- -d filename :如果 filename為目錄,則為真
- -f filename :如果 filename為常規文件,則為真
- -L filename : 如果 filename為符號鏈接,則為真
- -r filename :如果 filename可讀,則為真
- -w filename :如果 filename可寫,則為真
- -x filename :如果 filename可執行,則為真
- -s filename :如果文件長度不為0,則為真
- -h filename :如果文件是軟鏈接,則為真
- filename1 -nt filename2 :如果 filename1比 filename2新,則為真。
- filename1 -ot filename2 :如果 filename1比 filename2舊,則為真。
示例-檢查當前目錄的test文件是否存在:
#!/bin/bash testfile="${PWD}/test" if [ -e "$testfile" ];then echo " $testfile is exist" fi
11.3 在比較整數時,都使用-eq -ne –gt –ge –lt -le等
示例:
//-eq 判斷等於(equal) if [ "$a" -eq "$b" ] //-ne 判斷不等於(no equal) if [ "$a" -ne "$b" ] //-gt 大於(greater than) if [ "$a" -gt "$b" ] //-ge 大於等於 if [ "$a" -ge "$b" ] //-lt 小於(less than) if [ "$a" -lt "$b" ] //-le 小於等於 if [ "$a" -le "$b" ]
11.4比較字元串時,只能使用!=和=,如果使用大於小於時,則需要加 \ 轉義
示例:
a="abcde" b="abc" if [ -n "$a" -o "$a" \> "$b" ] #判斷a非0,且a>b then echo "a > b" fi
11.5而[[]]也能適用於整數和字元串,而且對於整數或者字元串而言,它們都可以支持&&、||、<和>、!=、==
示例:
a=11 b=11 c="abc" e="abcd" if [[ "$a" == "$b" && "$c" < "$e" ]] then echo "a = b,c < e" fi
12.~波浪號
- ~ 為home目錄
- ~+ 為當前目錄,等價於$PWD
示例:
A=~ B=~+ echo $A #列印home目錄 echo $B #列印當前目錄
13.延時
- 在shell中,延時使用sleep命令
示例:
sleep 1 #延時1秒 sleep 0.5 #延時0.5秒 sleep 1m #睡眠1分 sleep 1h #睡眠1小時
14.變數賦值時的註意
- 如果變數里存在空白,則必須加上引用
示例:
a= 1 2 3 #將會出錯,正確的用法應該是a="1 2 3"