命令列參數解析 - Shell 指令碼

來源:互聯網
上載者:User
平時多少會用shell寫點小工具, 而這些小工具運行後的第一件事就是解析參數, 這裡總結了下shell指令碼幾種處理命令列參數的方法.


比較常見的做法就是解析bash內建的幾個特殊變數, 例如直接遍曆$*或者$@:


#/bin/sh
echo 'args from \$*'
for arg in $*; do
    echo $arg
done


echo 'args from \$@'
for arg in $@; do
    echo $arg
done


echo 'args from "\$*"'
for arg in "$*"; do
    echo $arg
done


echo 'args from "\$@"'
for arg in "$@"; do
    echo $arg
done
上面總共列出了4種遍曆的格式, 分別對$@和$進行遍曆, 這兩個變數的區別是$將所有的參數合為一個字串, 而$@將輸入的參數分別儲存不同的字串, 
例如執行get-args.sh a “b c” d的結果如下: coney:temp$./get-args.sh a “b c” d args from $ a b c d args from $@ a b c d args from “$” a b c d args from “$@” a b c d 
還有一種方法就是通過shift方法來將處理過的參數移除, 從而完成遍曆:


#!/bin/sh
while [ $# != 0 ]; do
    echo $1
    shift
done
其中$1代表第一個參數, 類似的$2, $3…分別代表第二個 第三個參數. $#是參數的總個數, 每次調用shift後, 會將所有的參數左移, 並將第一個參數移除, 所以在指令碼裡面我們只要一直訪問$1即可, 
這種方式比較適合解析類似-p 80這種類型的參數, 可以在解析到-p後, shift一下, 然後再解析該參數附帶的內容. 執行shift-args.sh a “b c” d的結果類似遍曆"$@“: 
coney:temp$./shift-args.sh a "b c” d a b c d 以上是使用shell內建變數處理的方式, 雖然遍曆較為簡單, 但是解析參數的時候很複雜, 尤其是要對參數的合法性做校正時, 需要大量邏輯. 
所以我們有更好的選擇: getopt. getopt命令可以將根據格式化字串將輸入參數重新整理排序, 方便我們進行處理, 並且對輸入的參數格式進行校正, 判斷參數格式是否正確以及符合規範. 下面是一個getopt的使用樣本:


#!/bin/sh
args=`getopt abc: "$@"`


# check arguments, exit on fail
if [ $? != 0 ]; then
    exit $?
fi


# reorder arguments
echo before reorder, args : $*
set -- $args
echo after reorder, args : $*


# parse arguments
while :; do
    opt=$1; shift
    case $opt in
        -a|-b)
            echo $opt is set;;
        -c)
            echo found $opt with $1; shift;;
        --)
            break;;
    esac
done


# print rest arguments
if [ -n "$*" ]; then
    echo arguments : $*
fi
指令碼一開始將格式化字串和指令碼接受的所有參數傳遞給getopt, getopt執行後將重新排序後的參數儲存在args中. 當然getopt會對參數進行校正, 如果校正失敗會直接在stderr上輸出錯誤資訊, 
並且將返回碼設為非0, 這樣我們就能夠及時終止指令碼執行. 我們傳入的格式化字串"abc:“的含義是, 接收-a -b -c三種切換參數, 並且-c開關有附加參數, 例如”-c file". 在拿到getopt重新排序的參數後, 
我們要通過"set – $args"替換指令碼接收的參數, 這樣$* $@ $1 $2等變數就可以使用排序後的參數, 先看下這個命令的運行效果: coney@UServer:~/temp$ ./getopt.sh file1 -ab -c “haha” file2 before reorder,
 args : file1 -ab -c haha file2 after reorder, args : -a -b -c haha – file1 file2 -a is set -b is set found -c with haha arguments : file1 file2 getopt將參數通過–分隔為兩部分,
 前面是控制開關, 後面是其他傳入的參數內容, 並且支援"-ab"這種格式的參數, 並自動分解為"-a -b". 這樣我們就能順序遍曆所有的開關, 然後再處理其他參數. 如果是"-c haha"這種類型的參數, 
我們只需要在遍曆的過程中多shift一次, 取出附加的參數即可. 在遍曆到"–“後, 剩下的參數便都是非開關的參數了. 
再來看下getopt對參數校正的效果: coney@UServer:~/temp$ ./getopt.sh -d -a -b getopt: invalid option – ’d' 
coney@UServer:~/temp$ ./getopt.sh -a -b -c getopt: option requires an argument – ‘c’ 
coney@UServer:~/temp$ ./getopt.sh -a –b getopt: unrecognized option ‘–b’ 
所以通過getopt進行參數, 不但極大的提升開發效率, 還能夠完美的支援標準的參數格式, 以及獲得健壯的錯誤處理。


docker自訂IP指令碼
docker_custom_ip.sh


# /bin/bashset -x# At another shell, learn the container process ID# and create its namespace entry in /var/run/netns/# for the "ip netns" command we will be using belowi=0j=2while [ $# != 0 ]; do  containerId=$(echo $1)  shift  pid=$(docker inspect -f '{{.State.Pid}}' $containerId)  echo $pid  $(mkdir -p /var/run/netns)  $(ln -s /proc/$pid/ns/net /var/run/netns/$pid)  $(ip link add A$i type veth peer name B$i)  $(brctl addif docker0 A$i)  $(ip link set A$i up)# Place B inside the container's network namespace,# rename to eth0, and activate it with a free IP  $(ip link set B$i netns $pid)  $(ip netns exec $pid ip link set dev B$i name eth0)  $(ip netns exec $pid ip link set eth0 address 12:34:56:$i$i:9a:bc)  $(ip netns exec $pid ip link set eth0 up)  $(ip netns exec $pid ip addr add 172.17.0.$j/16 dev eth0)  $(ip netns exec $pid ip route add default via 172.17.42.1)  i=$i+1  j=$j+1doneset +x



運行docker_custom_ip.sh containerId
便可為該容器賦172.17.0.2 ip修改i的值,可賦其它ip。可進一步最佳化為在命令列中輸入ip。
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.