如何在 bash 中重新排序命令行参数?在这种情况下,我只想将第一个 arg ( $1)移动到某个位置并设置$1为空值。
这是我的尝试:
#!/bin/bash
FIRST=$1
$1=
echo $* $FIRST
Run Code Online (Sandbox Code Playgroud)
给出:
% ./test.sh foo bar quux
./test.sh: line 4: foo=: command not found
foo bar quux foo
Run Code Online (Sandbox Code Playgroud)
它应该输出:
bar quux foo
Run Code Online (Sandbox Code Playgroud)
您不能单独分配给位置参数(除了在 zsh 中,它1=value与所有其他分配匹配)。
如果你想将第一个参数移到最后一个,这很简单shift,这将输出b c a:
set -- a b c
temp=$1
shift
echo "$@" "$temp"
Run Code Online (Sandbox Code Playgroud)
移动到中间有点棘手,在 Bash 中你可以"${@:n:m}"用来获取插入点前后的参数。它从n开始扩展前m 个参数。这给出(将第一个位置移动到第三个位置):b c a d e f g
set -- a b c d e f g
echo "${@:2:2}" "$temp" "${@:4}"
Run Code Online (Sandbox Code Playgroud)
当然,您也可以$1在这里使用 shift清除,只需相应地更改索引即可。
请注意,空字符串和不存在的参数之间存在差异。"$@"并且"${@:n:m}"将保留空元素,而(未加引号)$*将连接所有参数,然后将它们拆分为空格。这将删除空参数,但也会用空格分割参数。相比:
$ set -- foo '' 'bar bar'
$ printf ":%s\n" "$@"
:foo
:
:bar bar
$ printf ":%s\n" $*
:foo
:bar
:bar
Run Code Online (Sandbox Code Playgroud)
(未加引号的扩展也会通过文件名扩展,因此*会扩展到当前目录中的所有文件等)
| 归档时间: |
|
| 查看次数: |
1294 次 |
| 最近记录: |