在终端(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存储为字符串并在另一个变量中执行,但我也无法正常工作。
答案 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
。