# bash脚本中可以通过shift传递多个参数 $ cat a.sh echo num is $# echo"all is $*" while [ $# -gt 0 ]; do echo$# case$1in -a) echo"-a is '$*'" echo"-a \$12 is '$1' '$2'" # 如果需要同时指定选项和参数,如-a aa,则需要在case循环里添加shift,$1为选项-a,$2为参数aa # 如果只需要指定选项,如-a -b,则只需要在case循环外添加shift即可,$1始终为选项 shift ;; -b) echo"-b is $*" echo"-b \$123 is $1$2$3" # 在case循环中只设置变量,而不要直接执行命令,建议在循环外判断变量值后再执行相应的命令 #save_log=$1 #file_path=$2 shift ;; -c) echo"-c is $*" shift ;; *) #echo "* is $*" echohelp # 如果输入的参数无效则退出 #exit ;; esac shift done
$ bash a.sh -a aa num is 2 all is -a aa 2 -a is '-a aa' -a $12 is '-a''aa'
$ bash a.sh -a aa -b bb -c cc num is 6 all is -a aa -b bb -c cc 6 -a is '-a aa -b bb -c cc' -a $12 is '-a''aa' 4 -b is -b bb -c cc -b $123 is -b bb -c 2 -c is -c cc
$ bash a.sh -a aa -b bb -c cc -d dd num is 8 all is -a aa -b bb -c cc -d dd 8 -a is '-a aa -b bb -c cc -d dd' -a $12 is '-a''aa' 6 -b is -b bb -c cc -d dd -b $123 is -b bb -c 4 -c is -c cc -d dd 2 help 1 help
# 注意两次shift分别为case循环和while循环,参数-d dd只执行了while循环中的shift $ bash -x a.sh -a aa -b bb -c cc -d dd + echo num is 8 num is 8 + echo'all is -a aa -b bb -c cc -d dd' all is -a aa -b bb -c cc -d dd + '[' 8 -gt 0 ']' + echo 8 8 + case$1in + echo'-a is '\''-a aa -b bb -c cc -d dd'\''' -a is '-a aa -b bb -c cc -d dd' + echo'-a $12 is '\''-a'\'' '\''aa'\''' -a $12 is '-a''aa' + shift + shift + '[' 6 -gt 0 ']' + echo 6 6 + case$1in + echo'-b is -b bb -c cc -d dd' -b is -b bb -c cc -d dd + echo'-b $123 is -b bb -c' -b $123 is -b bb -c + shift + shift + '[' 4 -gt 0 ']' + echo 4 4 + case$1in + echo'-c is -c cc -d dd' -c is -c cc -d dd + shift + shift + '[' 2 -gt 0 ']' + echo 2 2 + case$1in + echohelp help + shift + '[' 1 -gt 0 ']' + echo 1 1 + case$1in + echohelp help + shift + '[' 0 -gt 0 ']'
# 需要关闭case循环中的shift $ bash a.sh -a -b num is 2 all is -a -b 2 -a $12 is '-a''-b' 1 -b $12 is -b
# 需要开启case循环中的shift $ bash a.sh -a aa -b bb num is 4 all is -a aa -b bb 4 -a $12 is '-a''aa' 2 -b $12 is -b bb