这是我的代码,目的是批量分析.in和.out文件。 .in和.out文件都在同一目录中,并按名称排序。因此,测试所需的两个文件应该在目录中相邻。但是,当我想使用outFile=${arr[$(i++)]}
获取.out文件时,它会显示i++: command not found
。我脚本中的错误是什么?
#!/bin/sh
dir=$PATH
arr=($dir/*)
for((i=0;i<${#arr[@]};i++));do
inFile=${arr[$i]}
outFile=${arr[$(i++)]}
if diff $inFile $outFile > /dev/null; then
echo Same
else
echo $inFile
fi
done
答案 0 :(得分:4)
使用$(( i++ ))
。这是两个(不是一个)括号。
$( )
运行shell命令。$(( ))
评估算术表达式。此外:
您的脚本使用bash
功能(数组),最好使用#!/bin/bash
以避免混淆。
我不确定您对dir=$PATH
的期望是什么? $PATH
是一个特殊的环境变量,用于查找命令。如果我正确理解了脚本的意图,这可能不是你想要的。
i++
会在使用后增加值;所以这里inFile
和outFile
实际上是一样的!您可能希望使用++i
(它将修改变量而然后使用它),或仅使用i + 1
(不会修改变量)。
答案 1 :(得分:1)
括号中的内容已经在算术上下文中进行了评估,就像在$(( ... ))
中一样。所以你可以这样做:
for (( i=0; i < ${#arr[@]}; ));do
inFile=${arr[i++]}
outFile=${arr[i++]}
参考文献:
https://www.gnu.org/software/bash/manual/bashref.html#Arrays
下标被视为算术表达式......
https://www.gnu.org/software/bash/manual/bashref.html#Shell-Arithmetic
在表达式中,shell变量也可以通过名称引用,而不使用参数扩展语法。