修改 bash 中的命令行参数并重新排序

修改 bash 中的命令行参数并重新排序

如何在 bash 中重新排序命令行参数?在这种情况下,我只想将第一个 arg ( $1) 移动到某个位置并设置$1为空值。

这是我的尝试:

#!/bin/bash

FIRST=$1
$1=

echo $* $FIRST 

给出:

% ./test.sh foo bar quux
./test.sh: line 4: foo=: command not found
foo bar quux foo

它应该输出:

bar quux foo

答案1

您不能单独分配给位置参数(除了 zsh 中,它是1=value,与所有其他分配匹配)。

如果您想将第一个参数移至最后一个参数,这很容易使用shift,这将输出b c a

set -- a b c
temp=$1
shift
echo "$@" "$temp"

移动到中间有点棘手,在 Bash 中,您可以用来"${@:n:m}"获取插入点之前和之后的参数。它扩展了第一个参数开始于n。这给出b c a d e f g(将第一个位置移动到第三个位置):

set -- a b c d e f g
echo "${@:2:2}" "$temp" "${@:4}"

当然$1这里也可以用shift来清除,只需相应地改变索引即可。


请注意,空字符串参数和不存在的参数之间存在差异。"$@"并将"${@:n:m}"保留空元素,而 an (不带引号)$*将连接所​​有参数,然后将它们拆分为空格。这将删除空参数,但也会用空格分割参数。比较:

$ set -- foo '' 'bar bar'
$ printf ":%s\n" "$@"
:foo
:
:bar bar
$ printf ":%s\n" $*
:foo
:bar            
:bar

(不带引号的扩展也经过文件名扩展,因此*将扩展到当前目录中的所有文件等)

相关内容