【问题标题】:How to change a command line argument in Bash?如何在 Bash 中更改命令行参数?
【发布时间】:2011-06-17 04:40:27
【问题描述】:

有没有办法改变 Bash 脚本中的命令行参数?例如,像这样调用 Bash 脚本:

./foo arg1 arg2  

有没有办法在脚本中更改 arg1 的值?比如:

$1="chintz"

【问题讨论】:

    标签: bash command-line-arguments


    【解决方案1】:

    您必须重置所有参数。改变例如$3:

    $ set -- "${@:1:2}" "new" "${@:4}"
    

    基本上你set 所有 参数到它们的当前值,除了你想改变的那些。 set -- 也被指定为 by POSIX 7

    "${@:1:2}" notation 扩展为从偏移量1(即$1)开始的两个位置参数(因此符号中的2)。在这种情况下,它是 "$1" "$2" 的简写,但当您想要替换时它会更有用,例如"${17}".

    【讨论】:

    • 所以,为了更改 $3,我必须同时更改 $1 和 $2,是吗?并将它们更改为什么? “重置”是什么意思?
    • 感谢您的技巧!我很难将它用于嵌入空格的文件名。对于可能遇到该问题的其他任何人,请尝试将eval 放在每this 的行首。
    • 当您知道要更改的参数的位置时就可以了。如果您实际上不知道它并需要动态更改它怎么办?我尝试使用 $ set -- "${:1:$pivot}" 但它不接受那里的变量。
    • 如何在函数内部做同样的事情?从函数内部调用时,您的解决方案似乎不起作用。
    • 您不能在函数内更改脚本的位置参数 - 函数自己的参数会隐藏它们。但是,您可以将它们存储在一个数组中并对其进行操作。
    【解决方案2】:

    优化易读性和可维护性,您最好将$1$2 分配给更有意义的变量(我不知道,input_filename = $1output_filename = $2 或其他东西),然后覆盖其中一个变量(input_filename = 'chintz'),保持脚本的输入不变,以防其他地方需要。

    【讨论】:

    • 我想要一种可以改变其中一个输入参数本身的方法。我需要这样做,因为我想从脚本中返回一个值。 thkala 建议的答案效果很好。谢谢回复!!!
    • @Johnsyweb 同意。为了便于阅读,你的方法更好。
    • “你会更好”总是取决于用例,没有提供。
    • @Scott 比我写这个答案时年长 7 岁,经验也更多,我倾向于同意你的看法。
    • 这不起作用的示例(除了使用 $FIRST_PARAMETER 之类的东西):根据实际值确定参数的用途和含义。
    【解决方案3】:

    我知道这是一个旧的,但我发现thkala 的答案非常有帮助,所以我使用了这个想法并稍微扩展了它,使我能够为任何尚未定义的参数添加默认值 - 例如:

    
        # set defaults for the passed arguments (if any) if not defined.
        #
        arg1=${1:-"default-for-arg-1"}
        arg2=${2:-"default-for-arg-2"}
        set -- "${arg1}" "${arg2}"
        unset arg1 arg2
    
    

    我希望这对其他人有用。

    【讨论】:

      猜你喜欢
      • 2010-09-16
      • 2016-03-17
      • 1970-01-01
      • 2018-03-10
      • 2018-11-11
      • 1970-01-01
      • 2013-06-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多