簡體   English   中英

在shell腳本變量中執行bash命令時出錯

[英]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的數量,但要使Ffit-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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM