linux shell 輸入參數總結


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM