2013-04-30 216 views
0

我正在编写一个Bash脚本,它接受命令行参数,但不是一次一个,而是每次都使用一个case语句。使用多个参数的bash脚本

这里是我到目前为止的代码

while [ $# -gt 0 ] 
do 
    case "$1" in 
     -n|--name) 
      name="$2" 
     ;; 
     -s|--size) 
      size="$2" 
     ;; 
     -l|--location) 
      location="$2" 
     ;; 
    esac 
done 

此代码只接受一次一个,我需要它能够指定多达他们想要的。

+3

查看'shift'手册。另外看看'getopts',这是正确的方法 – 2013-04-30 00:50:15

回答

4

当使用getopt你能解决你的任务如下:

OPTS=`getopt -o n:s:l: --long name:,size:,location: -- "[email protected]"` 
eval set -- "$OPTS" 

这分裂原位置参数代入选项(即带参数,用冒号表示),其余的参数,这两者可能会被引用。之后评估getopt的结果,并且set -- $OPTS将位置参数$1,$2,$3,...设置为getopt获得的结果。之后,我们可以循环访问位置参数(并在我们遇到--时立即停止,该选项将选项与脚本的其余参数分开)。

while true 
do 
    case "$1" in 
    -n|--name) 
     name="$2" 
     shift 2 
     ;; 
    -s|--size) 
     size="$2" 
     shift 2 
     ;; 
    -l|--location) 
     location="$2" 
     shift 2 
     ;; 
    --) 
     shift 
     break 
     ;; 
    *) 
     echo "Internal error!" 
     exit 1 
    esac 
done 

echo -e "name: $name\nsize: $size\nlocation: $location"