如何在 Bash 中更改命令行参数?

Posted

技术标签:

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

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

./foo arg1 arg2  

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

$1="chintz"

【问题讨论】:

【参考方案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

我希望这对其他人有用。

【讨论】:

以上是关于如何在 Bash 中更改命令行参数?的主要内容,如果未能解决你的问题,请参考以下文章

如何在Bash包装器脚本中使用工具的所有命令行参数?

如何在bash脚本中使用命令行参数?

如何转义任意字符串以用作 Bash 中的命令行参数?

如何转义变量中的特殊字符以在 bash 中提供命令行参数

如何从 Git Bash 中将命令行参数传递给 Windows 应用程序?

在 linux/bash 中添加到命令行参数