Bash 在shell脚本中循环参数?

Bash 在shell脚本中循环参数?,bash,Bash,今天我正在写我的第一个Shell脚本。我想我已经在网上找到了我需要的一切,但有一件事需要帮助: 我希望在调用脚本时能够传递几个可选参数:例如myscript.sh-filename-somefilename-location-some/file/location-deleteoption yes 这3个选项都是可选的,因此我需要在第一阶段使用脚本循环遍历每个参数,然后根据参数的描述符(例如-filename)将值(somefilename)存储到正确的变量中 另一件事是,选项可以以任何顺序给出

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

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

这3个选项都是可选的,因此我需要在第一阶段使用脚本循环遍历每个参数,然后根据参数的描述符(例如
-filename
)将值(
somefilename
)存储到正确的变量中

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


如何实现此功能?

如果您是指bash,那么这里有一个相同的问题,并有一些很好的答案:

在BASH/SH中:

while [ $# -gt 0]
do

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

  shift

done

如果您使用的是bash,那么可能需要使用。否则,谷歌搜索“shellname选项解析”应该会为您选择的shell返回类似的结果。

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

$ cat my-script #!/bin/sh echo filename is ${filename-undefined} $ ./my-script filename is undefined $ filename=foo ./my-script filename is foo $cat我的脚本 #!/垃圾箱/垃圾箱 echo文件名为${filename undefined} $/我的脚本 文件名未定义 $filename=foo./my脚本 文件名是foo 这种方法的一个缺点是,任何子shell都将在其环境中定义文件名。这通常不是问题,但如果是,您肯定可以通过以下方法将其从环境中清除:

#!/bin/sh f=$filename unset filename filename=$f #!/垃圾箱/垃圾箱 f=$filename 取消设置文件名 文件名=$f 更大的问题是程序无法验证名称。例如,如果用户调用:

$ filname=foo ./my-script $filname=foo./my脚本
我的脚本无法注意到错误。如果解析参数,脚本可能会发出一个关于“未知选项'filname'”的错误,用户会注意到输入错误。在环境中传递值会使这样的检查变得不可能。

shell
不是一个shell,有必要弄清楚您是否使用了
bash
zsh
csh
tcsh
ash
ksh
dash
,或者其他任何形式的检查(虽然只是在比喻的意义上)可用的shell数量。对于bash,可能是