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

如何在Bash中更改命令行参数?,bash,command-line-arguments,Bash,Command Line Arguments,有没有办法更改Bash脚本中的命令行参数?例如,Bash脚本的调用方式如下: ./foo arg1 arg2 有没有办法在脚本中更改arg1的值?比如: $1="chintz" 您必须重置所有参数。要更改,例如,$3: $ set -- "${@:1:2}" "new" "${@:4}" 基本上,除了要更改的参数外,您可以将所有参数都设置为其当前值设置--也被指定 扩展为从偏移量1(即$1)开始的两个位置参数(因此符号中的2)。在这种情况下,它是“$1”“$2”的简

有没有办法更改Bash脚本中的命令行参数?例如,Bash脚本的调用方式如下:

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

$1="chintz"

您必须重置所有参数。要更改,例如,
$3

$ set -- "${@:1:2}" "new" "${@:4}"
基本上,除了要更改的参数外,您可以将所有参数都设置为其当前值<代码>设置--也被指定


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

优化易读性和可维护性时,您最好将
$1
$2
分配给更有意义的变量(我不知道,
input\u filename=$1
output\u filename=$2
或其他什么),然后覆盖其中一个变量(
input\u filename='chintz'
),保留脚本的输入不变,以备其他地方需要。

我知道这是一个旧的脚本,但我发现答案非常有用,因此我使用了这个想法并对其进行了略微扩展,以使我能够为任何未定义的参数添加默认值-例如:


    # 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


我希望这对其他人有用。

因此,为了兑换3美元,我必须同时兑换1美元和2美元,是吗?并将它们兑换成什么?什么是“重置”意思是?谢谢你的技巧!我很难用它来处理带有嵌入空格的文件名。对于可能遇到此问题的任何其他人,请尝试将
eval
放在per行的最前面。当你知道要更改的参数的位置时,这是可以的。如果你实际上不知道它,需要动态更改它怎么办?我尝试使用$set--“${:1:$pivot}”但它不接受变量。如何从函数内部执行相同的操作?从函数内部调用时,您的解决方案似乎不起作用。您无法从函数内部更改脚本的位置参数-函数本身的参数将其隐藏。但是,您可以将其存储在数组中并对其进行操作。我可以这是一种我可以改变其中一个输入参数本身的方法。我需要这样做,因为我想从脚本中返回一个值。thkala建议的答案效果很好。谢谢你的回答!!!@Johnsyweb同意。为了可读性,你的方法更好。“你过得更好”始终取决于未提供的用例。@Scott比我写此答案时年长7岁,经验丰富,我倾向于同意你的观点。例如,如果这样做不起作用(除了使用$FIRST_参数外):根据实际值确定参数的用法和意义。