在shell脚本变量中执行bash命令的错误

时间:2014-04-13 05:49:16

标签: bash shell sh

在终端(bash)中,以下命令生成正确的输出(整数)

ls -l | grep '.json' | grep -v 'fit-report.json' | wc -l

正确返回13。

在shell脚本中尝试相同的操作:

number_reports= $(ls -l | grep '.json' | grep -v 'fit-report.json' | wc -l)
echo "number of reports is $number_reports"

产生运行时错误:

line 1: ls -l | grep '.json' | grep -v 'fit-report.json' | wc -l: command not found
number of reports is 

我在没有$(..)包围的情况下尝试了它,并将var存储为字符串并在另一个变量中执行,但我也无法正常工作。

2 个答案:

答案 0 :(得分:4)

删除=周围的空格:

number_reports=$(ls -l | grep '.json' | grep -v 'fit-report.json' | wc -l)

虽然不推荐解析ls输出,因为您的文件名可以包含空格和换行符。

更新

最好使用此脚本来计算:

number_reports=0
while read -d ''; do
    ((number_reports++))
done < <(find . -maxdepth 1 -name "*.json" -a ! -name "fit-report.json" -print0)

echo "number_reports=$number_reports"

答案 1 :(得分:2)

如果我理解正确,您希望当前目录中的文件名 F 的数量以.json结尾,但 F fit-report.json (尽管你并没有用你的grep和管道链来表达这一点。)

一种直接的纯粹bash方式,使用(扩展)globs和数组:

shopt -s nullglob extglob
filenames=( !(fit-report).json )
printf "number of reports is %d\n" "${#filenames[@]}"

=标志周围没有空格。)

shopt -s nullglob的使用是这样的,如果没有匹配(否则它会逐字扩展),并且shopt -s extglob打开扩展的globs,glob会扩展为空。

然后我们构建一个数组filenames,其中包含以.json结尾的所有文件名,忽略文件名fit-report(即!(fit-report)部分)。

然后我们打印此数组中的元素数量(数组filenames中的元素数量为${#filenames[@]})。

如果您真的想要变量中的报告数量:

number_reports=${#filenames[@]}

=标志周围没有空格)。

注意。这不会计算“隐藏”文件名(例如.hidden.json),除非您shopt -s dotglob

注意。 Do not parse the output of ls