Shell脚本错误:找不到命令

时间:2016-04-01 00:08:34

标签: bash shell unix sh

这是我的代码,目的是批量分析.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

2 个答案:

答案 0 :(得分:4)

使用$(( i++ ))。这是两个(不是一个)括号。

  • $( )运行shell命令。
  • $(( ))评估算术表达式。

此外:

  • 您的脚本使用bash功能(数组),最好使用#!/bin/bash以避免混淆。

  • 我不确定您对dir=$PATH的期望是什么? $PATH是一个特殊的环境变量,用于查找命令。如果我正确理解了脚本的意图,这可能不是你想要的。

  • i++会在使用后增加值;所以这里inFileoutFile实际上是一样的!您可能希望使用++i(它将修改变量而然后使用它),或仅使用i + 1(不会修改变量)。

    < / LI>

答案 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变量也可以通过名称引用,而不使用参数扩展语法。