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


92

有没有一种方法可以更改Bash脚本中的命令行参数。例如,以下列方式调用Bash脚本:

./foo arg1 arg2  

有没有办法在脚本中更改arg1的值?说,像

$1="chintz"

Answers:


147

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

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

基本上, 所有参数设置为它们的当前值,但要更改的参数除外。set --由POSIX 7指定。

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


1
因此,要更改$ 3,我还必须同时更改$ 1和$ 2,对吗?并将其更改为什么?“重置”是什么意思?
斯里拉姆

谢谢你的把戏!我很难将其用于带有嵌入式空格的文件名。对于可能遇到此问题的其他任何人,请尝试evalthis放在行的最前面。
cxw

2
当您知道要更改的参数的位置时,就可以了。如果您实际上不知道并且需要动态更改该怎么办?我尝试使用$ set-“ $ {:1:$ pivot}”,但此处不接受变量。
Daniele Segato 2014年

1
我如何从函数内部做同样的事情?从函数内部调用时,您的解决方案似乎不起作用。
Hashken

2
您不能从函数内部更改脚本的位置参数-函数自身的参数将其隐藏。但是,您可以将它们存储在数组中并对其进行操作。
thkala 2015年

22

优化可读性和可维护性,你可能会更好分配$1$2更有意义的变量(我不知道,input_filename = $1output_filename = $2什么的),然后重写这些变量(input_filename = 'chintz'),使输入到脚本不变的情况下,它是在其他地方需要。


我想要一种可以更改输入参数本身的方法。我需要这样做,因为我想从脚本中返回一个值。thkala提出的答案很好。感谢您的回复!!!
斯里拉姆

3
@Johnsyweb同意。出于可读性考虑,您的方法更好。
Dss

1
“您的状况更好”始终取决于用例,但未提供用例。
斯科特,

2
@Scott比我写这个答案大7岁,比我有更多的经验,我倾向于同意你的看法。
Johnsyweb

这将不起作用的示例(除了使用类似$ FIRST_PARAMETER之类的东西外):根据实际值使用参数的含义和含义。
伊戈尔·斯托帕
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.