linux之bash指令碼特殊字元
在括號中的命令列表,將會作為一個子 shell 來執行。
在括號中的變數,由於是在子shell中,所以對於指令碼剩下的部分是不可用的。父程序,也就是指令碼本身,將不能夠讀取在子程序中建立的變數,也就是在子shell 中建立的變數
1.括號
#!/bin/bash
a=123
( a=321; )
echo "$a" #a的值為123而不是321,因為括號將判斷為區域性變數
輸出 123
大括號({})
2.陣列
建立陣列
#!/bin/bash
array={1 4 5 7 9 14}
echo ${array[3]}
輸出 7
3.副檔名
複製 t.txt 的內容到 t.back 中
#!/bin/bash
if [ ! -w 't.txt' ]
then touch t.txt
fi
echo ' test test ' >> t.txt
cp t.{txt,back}
4.程式碼塊
程式碼塊,又被稱為內部組,這個結構事實上建立了一個匿名函式(一個沒有名字的函式)。然而,與“標準”函式不同的是,在其中宣告的變數,對於指令碼其他部分的程式碼來說還是可見的
#!/bin/bash
a=123
{ a=321; }
echo "a=$a"
輸出 a =321
中括號([])
1.條件測試
條件測試表達式放在[ ]中。下列練習中的-lt (less than)表示小於號
#!/bin/bash
a=5
if [ 5 -lt 10 ]
then echo "a=$a"
else
echo 'a > 10'
fi
輸出 a=5
2.陣列元素
在一個array結構的上下文中,中括號用來引用陣列中每個元素的編號
#!/bin/bash
array=(1 4 5 6)
echo ${array[0]}
輸出 1
尖括號(<>)
重定向
test.sh > filename:重定向test.sh的輸出到檔案 filename 中。如果 filename 存在的話,那麼將會被覆蓋。
test.sh &> filename:重定向
test.sh >&2:重定向 test.sh 的 stdout 到 stderr 中。
test.sh >> filename:把 test.sh 的輸出追加到檔案 filename 中。如果filename 不存在的話,將會被建立。
豎線(|)
分析前邊命令的輸出,並將輸出作為後邊命令的輸入。這是一種產生命令鏈的好方法。
#!/bin/bash
tr 'a-z' 'A-Z'
exit 0
現在讓我們輸送ls -l的輸出到一個指令碼中:
$ chmod 755 test26.sh
$ ls -l | ./test26.sh
輸出的內容均變為了大寫字母
破折號(-)
1.選項,字首
在所有的命令內如果想使用選項引數的話,前邊都要加上“-”。
#!/bin/bash
a=5
b=5
if [ "$a" -eq "$b" ]
then
echo "a is equal to b."
fi
輸出 a is equal to b
2.用於重定向stdin或stdout
下面指令碼用於備份最後24小時當前目錄下所有修改的檔案
#!/bin/bash
BACKUPFILE=backup-$(date +%m-%d-%Y)
# 在備份檔案中嵌入時間.
archive=${1:-$BACKUPFILE}
# 如果在命令列中沒有指定備份檔案的檔名,
# 那麼將預設使用"backup-MM-DD-YYYY.tar.gz".
tar cvf - `find . -mtime -1 -type f -print` > $archive.tar
gzip $archive.tar
echo "Directory $PWD backed up in archive file \"$archive.tar.gz\"."
exit 0
破浪號~
表示home目錄