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

Sri*_*ram 81 bash command-line-arguments

有没有办法在Bash脚本中更改命令行参数.比如说,以下面的方式调用Bash脚本:

./foo arg1 arg2  
Run Code Online (Sandbox Code Playgroud)

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

$1="chintz"
Run Code Online (Sandbox Code Playgroud)

thk*_*ala 129

你必须重置所有参数.改变例如$3:

$ set -- "${@:1:2}" "new" "${@:4}"
Run Code Online (Sandbox Code Playgroud)

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

所述"${@:1:2}"符号被扩展为两个(因此2在符号)从起始位置参数偏移1(即$1)."$1" "$2"在这种情况下,它是一种速记,但是当你想要替换例如它时它会更有用"${17}".

  • 当您知道要更改的参数的位置时,这是可以的.如果您实际上不知道并需要动态更改它会怎么样?我尝试使用$ set - "$ {:1:$ pivot}",但它不接受变量. (2认同)
  • 您无法在函数内更改脚本的位置参数 - 函数自己的参数会隐藏它们.但是,您可以将它们存储在一个数组中并对其进行操作. (2认同)

Joh*_*web 21

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

  • @Johnsyweb同意.为了便于阅读,您的方法更好. (3认同)
  • @Scott比我写这个答案时年长7岁,经验更丰富,我倾向于同意你的看法. (2认同)

小智 9

我发现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
Run Code Online (Sandbox Code Playgroud)