1.
#-------------------------------------------------------------------------
9 # 強烈注意,在賦值的前後一定不要有空格
10 # 如果有空格會發生什麼?
11
12 # 如果"VARIABLE =value",
13 # ^
14 #+ 指令碼將嘗試運行一個"VARIABLE"的命令,帶著一個"=value"參數.
15
16 # 如果"VARIABLE= value",
17 # ^
18 #+ script tries to run "value" command with
18 #+ 指令碼將嘗試運行一個"value"的命令,帶著
19 #+ the environmental variable "VARIABLE" set to "".
19 #+ 一個被賦成""值的環境變數"VARIABLE".
20 #-------------------------------------------------------------------------
2.
################################Start Script#######################################
1 #!/bin/bash
2 # "裸體"變數
3
4 echo
5
6 # 變數什麼時候是"裸體"的,比如前邊少了$的時候.
7 # 當它被賦值的時候,而不是被引用的時候.
8
9 # 賦值
10 a=879
11 echo "The value of /"a/" is $a."
12
13 # 使用let賦值
14 let a=16+5
15 echo "The value of /"a/" is now $a."
16
17 echo
18
19 # 在for迴圈中
20 echo -n "Values of /"a/" in the loop are: "
21 for a in 7 8 9 11
22 do
23 echo -n "$a "
24 done
25
26 echo
27 echo
28
29 # 在read命令狀態中
30 echo -n "Enter /"a/" "
31 read a
32 echo "The value of /"a/" is now $a."
33
34 echo
35
36 exit 0
################################End Script#########################################
3.位置參數
就是從命令列中傳進來的參數,$0, $1, $2, $3...
$0就是指令檔的名字,$1是第一個參數,$2為第2個...,參見[1](有$0的說明),$9
以後就需要打括弧了,如${10},${11},${12}...
shift命令重新分配位置參數,其實就是向左移動一個位置.
$1 <--- $2, $2 <--- $3, $3 <--- $4, 等等.
老的$1將消失,但是$0(指令碼名)是不會改變的.如果你使用了大量的位置參數,那麼
shift命令允許你存取超過10個參數.雖然{}標記法也允許這樣.
例:
#!/bin/sh
# we have less than 3 arguments. Print the help text:
if [ $# -lt 3 ] ; then
cat <
ren -- renames a number of files using sed regular expressions
USAGE: ren 'regexp' 'replacement' files...
EXAMPLE: rename all *.HTM files in *.html:
ren 'HTM$' 'html' *.HTM
HELP
exit 0
fi
OLD="$1"
NEW="$2"
# The shift command removes one argument from the list of
# command line arguments.
shift
shift
# $* contains now all the files:
for file in $*; do
if [ -f "$file" ] ; then
newfile=`echo "$file" | sed "s/${OLD}/${NEW}/g"`
if [ -f "$newfile" ]; then
echo "ERROR: $newfile exists already"
else
echo "renaming $file to $newfile ..."
mv "$file" "$newfile"
fi
fi
done
講解:這是一個複雜一些的例子。讓我們詳細討論一下。第一個if運算式判斷輸入命令列參數是否小於3個 (特殊變數$# 表示包含參數的個數) 。如果輸入參數小於3個,則將協助文字傳遞給cat命令,然後由cat命令將其列印在螢幕上。列印協助文字後程式退出。 如果輸入參數等於或大於3個,我們就將第一個參數賦值給變數OLD,第二個參數賦值給變數NEW。下一步,我們使用shift命令將第一個和第二個參數從 參數列表中刪除,這樣原來的第三個參數就成為參數列表$*的第一個參數。然後我們開始迴圈,命令列參數列表被一個接一個地被賦值給變數$file。接著我 們判斷該檔案是否存在,如果存在則通過sed命令搜尋和替換來產生新的檔案名稱。然後將反短斜線內命令結果賦值給newfile。這樣我們就達到了我們的目 的:得到了舊檔案名稱和新檔案名稱。然後使用mv命令進行重新命名。
4.
通常用" [ ] " 來表示條件測試。注意這裡的空格很重要。要確保方括弧的空格。
[ -f "somefile" ] :判斷是否是一個檔案
[ -x "/bin/ls" ] :判斷/bin/ls是否存在並有可執行許可權
[ -n "$var" ] :判斷$var變數是否有值
[ -e "somefile" ]:判斷檔案是否存在
[ -d "somefile" ]:判斷是否為檔案夾
[ -r "somefile" ]:判斷檔案是否可讀
[ -w "somefile" ] :判斷檔案是否可寫
[ -x "somefile" ]:判斷檔案是否可執行
[ "$a" = "$b" ] :判斷$a和$a是否相等
5. 雙引號、單引號和反引號(後置引用)
雙引號:阻止了所有在引號中的特殊字元的重新解釋--包括變數名--但是$,`(後置引用)和/除外.保留$,作為特殊字元的意義,是為了能夠在雙引號中也能夠正常地引用變數("$var")。
使用""來防止單詞分割.[4]如果在參數列表中使用雙引號,將使得雙引號中的參數作為一個參數.即使雙引號中的字串包含多個單詞(也就是包含空白部分),也不會變為多個參數。
單引號:單引號操作總體上和""很像,但不允許引用變數.因為$的特殊含義被關閉了.在''中除了',其他
字元都沒有特殊的含義了.所以單引號比雙引號嚴格. 因為即使是/,在''中都被關閉了,所以你想在''中顯示'的含義,將得不到預期的效果.
反引號(後置引用):命令替換將會重新分配一個命令甚至是多個命令的輸出;:它會將命令的輸出如實地添加到另一個上下文中。使用命令替換的典型形式是使用後置引用(`...`). 後置引用形式的命令(就是被反引號括起來)將會產生命令列文本。
使用後置引用的意義在於:命令的輸出可以被當成傳遞到另一個命令的參數, 或者儲存到變數中, 甚至可以用來產生for迴圈的參數列表.
例如:
#!/bin/sh
file abc.zip #執行並輸出,但無法將其命令列輸出賦值給一個變數
file_type=`file abc.zip` #可執行並把其輸出賦值給變數file_type