解释一下shell命令:shift $(($optind - 1))

解释一下shell命令:shift $(($optind - 1))

我不是一个 Linux 爱好者,但我被困在一些脚本中,我必须为我的项目阅读这些脚本。那么任何人都可以帮助我这个命令在做什么吗?

shift $(($optind - 1))

答案1

shift $((OPTIND-1))(注意OPTIND是大写)通常在getopts while循环之后立即找到。$OPTIND是 找到的选项数getopts

正如 pauljohn32 在评论中提到的那样,严格来说,OPTIND给出了下一个命令行参数。

来自 GNUBash 参考手册:

getopts optstring 名称 [args]

getoptsshell 脚本使用它来解析位置参数。 optstring包含要识别的选项字符;如果一个字符后面跟着一个冒号,则该选项应该有一个参数,该参数应该用空格与其分隔。冒号(':')和问号('?')不能用作选项字符。每次调用时,getopts将下一个选项放入 shell 变量名称中,name如果不存在则进行初始化,并将下一个要处理的参数的索引放入变量中OPTINDOPTIND每次调用 shell 或 shell 脚本时都会初始化为 1。当选项需要参数时,getopts 将该参数放入变量 中OPTARG。外壳不会OPTIND 自动重置;getopts如果要使用一组新参数,则必须在同一 shell 调用中的多次调用之间手动重置它 。

当遇到选项末尾时,getopts退出并返回大于零的值。OPTIND设置为第一个非选项参数的索引,名称设置为“?”。

getopts通常解析位置参数,但如果 中给出了更多参数argsgetopts则解析这些参数。

shift n
删除n位置参数列表中的字符串。因此,从参数列表中shift $((OPTIND-1))删除已解析的所有选项,因此在此之后,将引用传递给脚本的第一个非选项参数。getopts$1

更新

正如 mikeserv 在评论中提到的那样,shift $((OPTIND-1))可能不安全。为了防止不必要的分词等,全部参数扩展应该用双引号引起来。所以该命令的安全形式是

shift "$((OPTIND-1))"

答案2

$((...))只是计算东西。在你的例子中,它取值$optint并减去 1。

shift删除位置参数。在您的情况下,它会删除optint-1参数。

help getopts欲了解更多信息,请查看help shift、查看man bash“算术扩展”,尤其是谷歌搜索getopts

相关内容