如何在 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 = $1
和output_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 中更改命令行参数?的主要内容,如果未能解决你的问题,请参考以下文章