shell指令碼命令行參數傳遞問題

來源:互聯網
上載者:User

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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.