在這里我想說的是幾種shell里的小括號,大括號結構和有括號的變量,命令的用法,如下:
1.${var}
2.$(cmd)
3.()和{}
4.${var:-string},${var:+string},${var:=string},${var:?string}
5.$((exp))
6.$(var%pattern),$(var%%pattern),$(var#pattern),$(var##pattern)
現(xiàn)在分述如下:
1.Shell中變量的原形:${var}
大家常見的變量形式都是$var,如
$ var=test
$ echo $var
test
但當你要顯示變量值加隨意的字符(我這里用AA)時,就會出錯,如下:
$ echo $varAA
$
這時應該用變量的原形:${var},即是加一個大括號來限定變量名稱的范圍,如下
$ echo ${var}AA
testAA
$
以這個特性,我們可以很方便地寫一個批量改后綴名的程序,我把它命名為mymv,程序如下:
#!/bin/bash
tail=$1
for filename in `ls`
do
mv $filename ${filename}.$tail
done
程序需要提供一個后綴名,如c,表示改為后綴為c的C程序文件,看下面的測試:
$ ls
a b c
$ mymv c
$ ls
a.c b.c c.c
$
看樣子程序運行的很好,但這是不完善的程序,有2個要注意的問題:
A,目錄下沒有子目錄,如果有一個目錄,假設為dir,則也會被改為dir.c,這顯然不是我們想要的,應該修正這個程序能識別目錄。
B,沒有幫助對程序的參數(shù)進行處理,程序應該足夠友好,在用戶沒有給定后綴名時應能處理,像上面的將直接給文件加上了一個點(.),這顯然也不是我們想要的。
因為我們的目的是說明${var},這樣已經(jīng)足夠了,因此這里不會再對上面的程序進行修正。
2.命令替換$(cmd)
命令替換$(cmd)和符號`cmd`(注意這不是單引號,在美式鍵盤上,`是ESC下面的那個鍵)有相同之處
$ ls
a b c
$ echo $(ls)
a b c
$ echo `ls`
a b c
我們來分析一下命令echo $(ls),以便理解所謂命令替換是什么意思:
shell掃描一遍命令行,發(fā)現(xiàn)了$(cmd)結構,便將$(cmd)中的cmd執(zhí)行一次,得到其標準輸出,再將此輸出放到原來命令echo $(ls)中的$(ls)位置,即替換了$(ls),再執(zhí)行echo命令。
如下:
echo $(ls)被替換成了echo a b c
這里要注意的是$(cmd)中的命令的錯誤輸出是不會被替換的,替換的只是標準輸出:
$ var=$(cat d) ###文件d在當前目錄不存在
cat: d: 沒有那個文件或目錄
$ echo $var
$ ###顯然var變量的值是空的
3、一串的命令執(zhí)行()和{}
()和{}都是對一串的命令進行執(zhí)行,但有所區(qū)別:
A,()只是對一串命令重新開一個子shell進行執(zhí)行
B,{}對一串命令在當前shell執(zhí)行
C,()和{}都是把一串的命令放在括號里面,并且命令之間用;號隔開
新聞熱點
疑難解答