變數的判斷與初始化,示例如下:
sh-4.2# file=/dir1/dir2/dir3/my.file.txt
sh-4.2# echo $
dir1/dir2/dir3/my.file.txt
普通擴充套件,示例如下:
sh-4.2# echoahabh ach adh aeh afh agh
自動補全,示例如下:
sh-4.2# echoa b c d e f
**塊,示例如下:
#!/bin/bashnum()
num
shell擴充套件中並沒有中括號的使用,shell命令中對中括號主要是用於判斷,類似test,示例如下:
1.單括號test命令要對變數進行單詞分離,當變數值包含空白符時,要用引號將變數括起來;而雙括號的test命令不會對變數進行單詞分離。以下情況分為變數為單個單詞,含有空格的片語。
sh-4.2# name=hellosh-4.2# [ $name = "
hello"]
sh-4.2# echo $?
0sh-4.2# [[ $name = "
hello"]]
sh-4.2# echo $?
0
得出結論,因為變數只有乙個單詞,單雙括號的單詞分離都沒有影響到這個變數了。
sh-4.2# name="hello world
"sh-4.2# [ $name = "
hello world"]
sh: [: too many arguments
sh-4.2# echo $?
2sh-4.2# [ "
$name
" = "
hello world"]
sh-4.2# echo $?
0sh-4.2# [[ $name = "
hello world"]]
sh-4.2# echo $?
0
這次變數是乙個片語了,帶空格那種了。當我們要測試時,結果發現bash回應引數太多了,這是怎麼回事呢?原來是單引號test命令對變數進行單詞分離了,結果也就變成了[ hello world = "hello world" ],多了那個字串hello,成了字串world和字串hello world之間的比較了。因此如果在單括號的test命令中的變數含有空格,但它還得和字串比較,那就必須給變數加個雙引號了,這時它就不會發生錯誤了。而在下面的雙括號的test命令中,即使變數含有空格又何妨,因為它不能對變數單詞進行分離。
2.單方括號的test命令,通常用內建的test命令來測試表示式的值,test命令也被鏈結到方括號上。這樣,既可以使用單獨的test命令,也可以通過把表示式用單方括號括起來,來測試表示式的值。
sh-4.2# ls -lah test-rw-r--r-- 1 root root 6 dec 17
15:51
test
sh-4.2# test -r test ; echo $?
0sh-4.2# [ -r test ]; echo $?
0
3.單括號的test命令不對shell元字元進行擴充套件的,而雙括號test命令則會對shell元字元進行擴充套件的了。言外之意,雙中括號支援正則。
sh-4.2# name=tomsh-4.2# [ $name = t??]
sh-4.2# echo $?
1sh-4.2# [[ $name = t??]]
sh-4.2# echo $?
0
4.在雙括號的test命令當中,如果乙個字串(不管含不含有空格)僅僅是在表示式中作為乙個普通字串,而不是乙個模式的一部分,則它也必須用引號括起來。
我的理解是如果乙個字串值(右邊那個的了)不加雙引號,那這個字串就是模式來的,如果它裡面有含有shell元字元,bash會對它進行擴充套件。如果字串加了雙引號,那它就是乙個很普通的字串的,即便字串裡面裡面含有特殊字元,也就是當普通內容來處理。
sh-4.2# name=tommsh-4.2# [[ $name =tom ]]
sh-4.2# echo $?
1sh-4.2# name=tom
sh-4.2# name1=tomm
sh-4.2# [[ $name =tom ]]
sh-4.2# echo $?
0sh-4.2# [[ $name = tom?]]
sh-4.2# echo $?
1sh-4.2# [[ $name1 =tom ]]
sh-4.2# echo $?
1sh-4.2# [[ $name1 = tom?]]
sh-4.2# echo $?
0sh-4.2# [[ $name = "
tom"
]]sh-4.2# echo $?
0sh-4.2# [[ $name = "
tom?"]]
sh-4.2# echo $?
1sh-4.2# [[ $name1 = "
tom"
]]sh-4.2# echo $?
1
5.[ express1 –a express2 ] 這是放在單括號的test命令中的,因為單的不支援元字元擴充套件,因此就只能叫做表示式了,它們可以組合構成邏輯測試的,不過與或非使用( -a –o !)的形式。
sh-4.2# ls -lah test-r--r--r-- 1 root root 6 dec 17
15:51
test
sh-4.2# [ -r test -a -x test ]
sh-4.2# echo $?
1
[[pattern1 –a pattern1]] 這是放在雙括號test命令中的,因為單條式子可以支援元字元嘛,所以可以叫做模式表示式了,也就可以用於復合邏輯了,不過與非或使用(&& || !)的形式了。
sh-4.2# echo$name
tomsh-4.2# [[ $name = [tt]om && $name = t??]]
sh-4.2# echo $?
0
1、單小括號( ):把括號內的命令在另乙個shell執行,並把結果返回,左右不留空格,一般要帶字首 $;示例如下
sh-4.2# echo $(ls)1test
sh-4.2# ls -lah
total
8.0k
drwxr-xr-x 2 root root 27 dec 17
17:51
.dr-xr-xr-x. 19 root root 268 dec 17
15:03
..-rw-r--r-- 1 root root 80 dec 17
17:51
1-r--r--r-- 1 root root 6 dec 17
15:51 test
2、雙小括號(( )) :整數比較、四則運算,括住的內容,完全符合c語言語法,一般要帶字首 $
sh-4.2# echo $((1+2))3
大括號表示次數,示例如下
sh-4.2# catfile
1234
11234
2345
22345
5678
12345678
sh-4.2# grep -e "1"
file --color
11234
中括號表示範圍,示例如下
sh-4.2# grep -e "[1-4]
"file --color
1234
11234
2345
22345
12345678
小括號表示乙個完整的字串,示例如下
sh-4.2# grep -e "(1234)
"file --color
1234
11234
12345678
shell中的括號
在編寫shell scripts時,經常會用到括號,各種括號,各種用法。一 括號 圓括號 1 單小括號。命令組。括號中的命令將會新開乙個子shell順序執行,所以括號中的變數不能夠被指令碼餘下的部分使用。括號中多個命令之間用分號隔開,最後乙個命令可以沒有分號,各命令和括號之間不必有空格。命令替換。等...
shell中的括號
一 括號 圓括號 1 單小括號。命令組。括號中的命令將會新開乙個子shell順序執行,所以括號中的變數不能夠被指令碼餘下的部分使用。括號中多個命令之間用分號隔開,最後乙個命令可以沒有分號,各命令和括號之間不必有空格。命令替換。等同於 cmd shell掃瞄一遍命令列,發現了 cmd 結構,便將 cm...
shell中的括號
假設我們定義了乙個變數為 file dir1 dir2 dir3 my.file.txt 拿掉第一條 及其左邊的字串 dir1 dir2 dir3 my.file.txt 拿掉最後一條 及其左邊的字串 my.file.txt 拿掉第乙個 及其左邊的字串 file.txt 拿掉最後乙個 及其左邊的字串...