如何在 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
(不带引号的扩展也经过文件名扩展,因此*
将扩展到当前目录中的所有文件等)