for last; do true; done echo $last
這一個也很漂亮(再次,應該使用bash,ksh和sh),它不移動參數,這可能是很好的。
它使用的事實是,如果你不告訴它什么循環,隱含循環的參數,以及事實,循環變量沒有作用域:它們保持它們設置的最后一個值。
getopts optstring name [arg ...]
optstring列出了對應的shell 腳本可以識別的所有參數。比如:shell script可以識別-a, -f 以及-s參數,則optstring就是afs;如果對應的參數后面還跟隨一個值,則在相應的optstring后面加冒號。比如a:fs表示a參數后面會有一個值出現,-a value的形式。另外,getopts執行匹配到a的時候,會把value存放在一個OPTARG的shell 變量中。如果optstring是以冒號開頭的,命令行當中出現了optstring當中沒有的參數將不會提示錯誤信息。
name表示的是參數的名稱,每次執行getopts,會從命令行當中獲取下一個參數,然后存放到name中。如果獲取到參數不在optstring中,則name的值被設置為?。命令行當中的所有參數都有一個index,第一個參數從1開始,依次類推,另外有一個名為OPTIND的shell變量存放下一個要處理的參數的index。
#!/bin/bash func() { echo "Usage:" echo "test.sh [-j S_DIR] [-m D_DIR]" echo "Description:" echo "S_DIR,the path of source." echo "D_DIR,the path of destination." exit -1 } upload="false" while getopts 'h:j:m:u' OPT; do case $OPT in j) S_DIR="$OPTARG";; m) D_DIR="$OPTARG";; u) upload="true";; h) func;; ?) func;; esac done echo $S_DIR echo $D_DIR echo $upload //執行結果: [root@bobo tmp] sh test.sh -j /data/usw/web -m /opt/data/web /data/usw/web /opt/data/web false [root@bobo tmp] sh test.sh -j /data/usw/web -m /opt/data/web -u /data/usw/web /opt/data/web true [root@bobo tmp] sh test.sh -j /data/usw/web /data/usw/web false [root@bobo tmp] sh test.sh -m /opt/data/web /opt/data/web false [root@bobo tmp] sh test.sh -h test.sh: option requires an argument -- h Usage: test.sh [-j S_DIR] [-m D_DIR] Description: S_DIR,the path of source. D_DIR,the path of destination. [root@bobo tmp] sh test.sh j false [root@bobo tmp] sh test.sh j m false
getopts后面跟的字符串就是參數列表,每個字母代表一個選項,如果字母后面跟一個冒號,則表示這個選項還會有一個值,比如-j /data/usr/web 和 -m /opt/data/web。而getopts字符串中沒有跟隨冒號的字母就是開關型的選項,不需要指定值,等同於true/false,只要帶上這個參數就是true。
shift位移使用舉例:
#!/bin/bash #test3.sh func() { echo "Usage:" echo "test.sh [-j S_DIR] [-m D_DIR]" echo "Description:" echo "S_DIR, the path of source." echo "D_DIR, the path of destination." exit -1 } upload="false" echo $OPTIND while getopts 'h:s:d:u' OPT; do case $OPT in s) S_DIR="$OPTARG";; d) D_DIR="$OPTARG";; u) upload="true";; h) func;; ?) func;; esac done echo $OPTIND echo $(($OPTIND -)) echo $1 //執行結果: [root@bobo tmp] sh test3.sh -s /data/usw/web beijing 1 #執行的是第一個"echo $OPTIND" 3 #執行的是第二個"echo $OPTIND" beijing #此時$1是"beijing" [root@bobo tmp] sh test3.sh -s /opt/data/web beijing 1 #執行的是第一個"echo $OPTIND" 3 #執行的是第二個"echo $OPTIND" beijing [root@bobo tmp] sh test3.sh -s /data/usw/web -d /opt/data/web beijing 1 #執行的是第一個"echo $OPTIND" 5 #執行的是第二個"echo $OPTIND" beijing 參數位置: 1 2 3 4 5 6 [root@bobo tmp] sh test3.sh -s /data/usw/web -d /opt/data/web -u beijing 6 beijing
參考資料
http://www.voidcn.com/article/p-ejbacwbp-bsh.html
https://www.clarkhu.net/?p=5883