[英]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.