一 命令替換
1.命令替換的兩種形式
(1)var=`basename $0`
(2)var=$(basename $0)
2.命令替換會調用一個subshell
3.
(1)command `echo a b` #2args: and b
(2)command "`echo a b`" #1args:"a b"
(3)dir=`ls -l`
echo $dir #換行消失
echo "$dir" #
4.
var1=`<file1`
var2=`cat file2` #var1 and var2 分別是file1 和file2檔案的內容
5.變數替換允許將以個迴圈的輸出放入一個變數中
var=`for i in 1 2 3 4 5
do
echo -n $"$i"
done` #var=12345
6.
#include <stdio.h>
int main()
{
printf("Hello World!");
return 0;
}
#!/bin/bash
greeting=`./a.out`
echo $greeting
exit 0
7.對於命令替換而言,$()形式已經取代了``
兩種形式在下面的情況下輸出並不相同
(1)echo `echo \\` #
(2)echo $(echo \\) #\
(3)$(...)形式的命令替換允許嵌套
word_count=$(wc -w $(echo "test.sh"))
二 算數擴充
算數擴充的集中形式
a=100
(1)var=`expr $a + 3` #“+”兩邊的空格是不能缺少的
否則var=100+3
(2)雙括弧形式
((...)) 獨立執行,不能對其他變數賦值 $((...)),不能單獨執行,
用於對其他變數進行賦值
((var+=3))
var=$((var+3))
var=$(($var+3)) #這種形式下+兩邊可以有空格
(3)let var+=3
let "var+=3"
三 I/O重新導向
1.
: > filename #把檔案filename截斷為0長度,不存在,則建立
:是一個預留位置,不產成任何輸出,去掉:在某些shell中可能會
有問題
2.stdin,stdout,stderr的檔案描述符分別是0,1,2
(1)當他們出現在>,>>右邊的時候需要在前面加&
(2)i>&j 重新導向檔案描述符i到j
(3)<filename 從檔案接受輸入,不能是命令
(4)[j]<>filename
為了讀寫filename,把檔案filename開啟,並分配檔案
描述符j給它,如果檔案filename不存在,則建立它
,如果檔案描述符j沒制定,預設0
3.
(1) exec 6<&0 #檔案描述符儲存了stdin
exec <datafile
read a1
read a2
exec 0<&6 6<&- #從fd6中恢複stdin,關閉fd6
(2)exec 6>&1 #fd6儲存了stdout
exec >$LOGFILE
echo "data"
exec 1>&6 6>&- #從fd6中回複stdout,關閉fd6
四 代碼塊重新導向
像while,until,fo ,if/then和函數都可以重新導向(輸出或者輸入重新導向,同時也可)
(1)while [ .... ];do
.....
done <"$filename" #另一種方法就是用上面剛講過的內容也可
(2)until [ ... ];do
...
done <"$filename"
(3)for var [in list]
do
...
done < "$filename"
(4)if [ ... ]
then
...
fi < "$filename"
(5)
show()
{
}<"$filename"
五 Here Documents
1.here document就是一段特殊目的的代碼塊,使用I/O重新導向的形式將一個命令序列傳遞到一個互動程式或者命令中,
(1)command <<HEREDOCUMENT
HEREDOCUMENT
(2)here document中可以使用參數替換
(3)當<<後面的HEREDOCUMENT加單引號,雙引號或者\時,關閉參數替換
(4)用來產生指令碼
(cat <<'EOF'
#inlcude <stdio.h>
int main()
{
printf("Hello Shell!\n");
return 0;
}
EOF)>$filename
(5)為同一指令碼中的函數提供參數
show()
{
read firstname
read lastname
}
show<<CONTENT
Zone
Guo
CONTENT
(6)here strings COMMAND<<<$WORD
# $WORD將被擴充並送入COMMAND的stdin中