在shell脚本中循环参数?

时间:2012-01-06 14:07:24

标签: bash

我今天正在编写我的第一个Shell脚本。我想我已经找到了我在网上需要的所有东西,但在一件事上需要帮助:

我希望能够在调用脚本时传递几个可选参数:例如myscript.sh -filename somefilename -location some/file/location -deleteoption yes

所有这三个选项都是可选的,所以我需要在第一阶段的脚本循环遍历每个参数,然后根据参数的描述符(例如-filename)存储值(somefilename )进入正确的变量?

另一件事是可以按任何顺序给出选项。

如何实现此功能?

4 个答案:

答案 0 :(得分:2)

如果您使用的是bash,则可能需要使用getopts。否则,使用Google搜索“ shellname 选项解析”应该为您选择的shell返回类似的内容。

答案 1 :(得分:0)

如果你的意思是bash,那么这里有一个相同的问题,有一些好的答案:

How to iterate over arguments in a Bash script

答案 2 :(得分:0)

在BASH / SH:

while [ $# -gt 0]
do

  # parse arguments, arguments are in $1 TO $9

  shift

done

答案 3 :(得分:0)

一种方法是在环境中传递内容而不是使用getopts来解析参数。例如:

$ cat my-script
#!/bin/sh
echo filename is ${filename-undefined}

$ ./my-script
filename is undefined
$ filename=foo ./my-script
filename is foo

这种方法的一个缺点是任何子shell都会在其环境中定义 filename 。这通常不是问题,但如果是,你肯定可以通过以下方式将其从环境中解决:

#!/bin/sh
f=$filename
unset filename
filename=$f

更大的问题是程序无法验证名称。例如,如果用户调用:

$ filname=foo ./my-script

我的脚本无法注意到错误。如果您解析参数,脚本可能会发出有关“未知选项'filname'”的错误,并且用户会注意到错字。传递环境中的价值使得无法进行这样的检查。