我需要使用僅在運行時已知的值爲find
建立參數列表。我試圖用數組來做到這一點。使用數組構建參數列表
下面是使用硬編碼值的簡化版本。當我回應這個命令時,它看起來是正確的(當我手動運行它時,它會做我期望的)。當它進入for-loop時,它似乎在運行find
(因爲當我手動運行時,我可以看到與其他用戶擁有的目錄相同的錯誤Permission denied
)。但是在for循環中,它不會回顯手動運行發現的任何.txt
文件。
我做錯了什麼?
#!/bin/bash
args=(/tmp -iname \"*.txt\")
#args+=(-o -iname \"*.jpg\")
echo command will be: find ${args[@]}
for f in $(find ${args[@]}); do
echo found $f
done
下面接受的答案正確地確定了問題。但是,如果我添加一個額外的-iname
條款,我的劇本「忽略」除了最後詳見這裏:
#!/bin/bash
args=($1)
args+=(-maxdepth $2)
args+=(-iname "*$3")
args+=(-o -iname "*$4")
echo command will be: find "${args[@]}"
find "${args[@]}" -print 2>/dev/null | while read -r f; do
echo found "$f"
done
例如,當/home/me 2 .jpg .png
稱這種正確的呼應,該命令將find /home/me -maxdepth 2 -iname *.jpg -o -iname *.png
但當時只有我的腳本回應它找到的.png
文件。
引用您的變量。 (例如''$ {args [@]}「',」$ f「等)。也不要像這樣讀取find的輸出。 http://mywiki.wooledge.org/DontReadLinesWithFor http://mywiki.wooledge.org/BashFAQ/001 –
請勿轉義引號。 – Barmar