说我有以下几点:
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)