【问题标题】:Using getopts within user-defined-function in bourne shell在 bourne shell 的用户定义函数中使用 getopts
【发布时间】:2010-09-26 00:10:32
【问题描述】:

是否可以从 bourne 脚本中将命令行参数传递给函数,以便让 getopts 处理它们。

我的脚本的其余部分很好地打包到函数中,但看起来我必须将参数处理移动到主逻辑中。

下面是现在的写法,但是不行:

进程参数() { 而 getopts j:f: arg 做 回声“${arg}——${OPTARG}” 案例“${arg}”在 j) 如果 [ -z "${filename}" ];然后 工作编号=$OPTARG 别的 echo "文件名 ${filename} 已设置。" echo "作业号 ${OPTARG} 将被忽略。 菲;; f) 如果 [ -z "${job_number}" ];然后 文件名=$OPTARG 别的 echo "已设置工作编号 ${job_number}。" echo "文件名 ${OPTARG} 将被忽略。" 菲;; 经社理事会 完毕 } 做东西1 过程参数 做东西2

是否有可能以可以读取脚本参数的方式定义函数?这可以通过其他方式完成吗?我喜欢 getopts 的功能,但在这种情况下,我将不得不牺牲代码的美感来获得它。

【问题讨论】:

    标签: shell sh getopts


    【解决方案1】:

    您可以在变量之后为 getopts 提供 args。默认值为 $@,但这也是 shell 函数用来表示 它们的 参数的方式。解决方案是将“$@”(将脚本的所有命令行参数表示为单独的字符串)传递给 processArgs:

    processArgs "$@"

    将其添加到您的脚本中(并修复第 11 行中的引用),并尝试一些乱码测试参数:

    $ ./try -j asdf -f fooo -fasdfasdf -j424pyagnasd j -- asdf f--foo 作业号 asdf 已设置。 文件名 fooo 将被忽略。 f——asdfasdf 作业号 asdf 已设置。 文件名 asdfasdf 将被忽略。 j -- 424pyagnasd

    【讨论】:

    • 我还建议在函数内部使用local OPTIND,以防止由于函数被多次调用而多次调用optargs时出现错误。
    • 我在定义一个函数并从交互式 shell 调用它时发现,正确的行为需要“本地 OPTIND”。
    猜你喜欢
    • 2012-11-09
    • 2015-05-28
    • 2013-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-12
    相关资源
    最近更新 更多