[英]errors executing bash command in shell script variable
在terminal(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存储为字符串并在另一个变量中执行它,但是我也无法正常工作。
删除=
周围的空格:
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"
如果我理解正确,则您希望当前目录中以.json
结尾的文件名F的数量,但要使F ≠ fit-report.json
(即使您未使用grep
s和管道链准确地表示出来)。
一种简单的纯bash方式,使用(扩展的)glob和数组:
shopt -s nullglob extglob
filenames=( !(fit-report).json )
printf "number of reports is %d\n" "${#filenames[@]}"
(在=
号周围没有空格)。
使用shopt -s nullglob
是,如果没有匹配项,则glob扩展shopt -s extglob
(否则逐字扩展为自身),而使用shopt -s extglob
可以打开扩展的glob。
然后,我们构建一个数组filenames
,其中包含所有以.json
结尾的文件名,而忽略文件名称fit-report
(这是!(fit-report)
部分)。
然后,我们打印此数组中的元素数(数组filenames
的元素数为${#filenames[@]}
)。
如果您确实想要一个变量中的报告数量:
number_reports=${#filenames[@]}
(在=
号周围没有空格)。
注意。 除非您.hidden.json
shopt -s dotglob
,否则这不会计算“隐藏”的文件名(例如.hidden.json
)。
注意。 不要解析ls
的输出 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.