如何在bash中访问命令行参数的下一个参数?

夢のの*_*のの夢 4 bash

说我有以下几点:

for i in $@; do
    echo ${i+1}
done
Run Code Online (Sandbox Code Playgroud)

我在 shell 上运行$ test.sh 3 5 8 4它,它输出1 1 1 1 为什么 ${i+1} 不起作用?我正在尝试访问命令行参数列表的下一个参数。

小智 7

shell 中的每个字符都可能有特殊的含义。

该代码${i+1}并不意味着“向 i 加 1”。
要了解它的含义,请执行以下命令:

LESS=+/'\{parameter\:\+word\}' man bash
Run Code Online (Sandbox Code Playgroud)

并阅读:

${parameter:+word}
使用替代值。如果参数为空或未设置,则不替换任何内容,否则替换单词的扩展。

还有一点:

省略冒号会导致仅对未设置的参数进行测试。

由于$i具有循环设置的值for i in $@;,“替代值”被替换并1打印。

如果要将参数值加 1,请执行以下操作:

for    i
do     echo "$((i+1))"
done
Run Code Online (Sandbox Code Playgroud)

不需要in "$@"(并习惯于引用所有扩展)。

$ ./test.sh 3 5 8 4
4
6
9
5
Run Code Online (Sandbox Code Playgroud)

下一个论点。

但这也不是“下一个论点”。核心问题在于您的循环,您在循环中使用参数的值,而不是参数的索引。您需要遍历i参数的索引,而不是i每个参数的值。就像是:

for (( i=1; i<=$#; i++)); do
    echo "${i}"
done
Run Code Online (Sandbox Code Playgroud)

这将打印一个索引,如下所示:

$ ./test.sh 3 5 8 4
1
2
3
4
Run Code Online (Sandbox Code Playgroud)

间接

我们如何访问位置的参数$i?:使用间接:

for (( i=1; i<=$#; i++)); do
    echo "${!i}"
done
Run Code Online (Sandbox Code Playgroud)

看到简单的!添加了吗?

现在它运行如下:

$  ./test.sh  3 5 8 4
3
5
8
4
Run Code Online (Sandbox Code Playgroud)

最终解决方案。

要打印当前参数和下一个参数,请使用以下命令:

for (( i=1; i<=$#; i++)); do
    j=$((i+1))
    echo "${!i} ${!j}"
done
Run Code Online (Sandbox Code Playgroud)

不,没有比计算变量中的值更简单的方法了$j


$ ./test.sh 3 5 8 4
3 5
5 8
8 4
4 
Run Code Online (Sandbox Code Playgroud)

这也适用于文本:

$ ./test.sh sa jwe yqs ldfgt
sa jwe
jwe yqs
yqs ldfgt
ldfgt 
Run Code Online (Sandbox Code Playgroud)