Bash
Bash 腳本不讀取輸入
我有一個腳本,它假設在後台執行一個命令,它就是這樣做的。問題是當腳本遇到讀取命令時,它不會暫停並接受輸入。這裡是:
printf "Where is yo music?: " read musicPath cd $musicPath ls | while read currentSong;do seconds=`mdls "$currentSong"|sed -n '20p'|awk '{print $3}'|cut -d. -f1` hours=$((seconds / 3600)) seconds=$((seconds % 3600)) minutes=$((seconds / 60)) seconds=$((seconds % 60)) echo "Song: $currentSong" echo "Length: $hours:$minutes:$seconds" afplay "$currentSong"& printf "yes (y), no (n), or maybe (m): " read choice case $choice in y) mkdir ../Yes mv "$currentSong" ../Yes ;; n) mkdir ../No mv "$currentSong" ../No ;; m) mkdir ../Maybe mv "$currentSong" ../ ;; *) echo "Invalid option! Continuing..." ;; esac kill $! done
該腳本存在許多問題,但導致您的特定問題的問題是因為您正在從管道讀取(的輸出
ls
)。1.不要解析
ls
改用這個
for currentSong in *; do ... done
除了您不應該解析的眾多原因之外,
ls
您看到的問題是因為 STDIN 連接到ls
. 因此,當您發出 a 時read
,它無法從終端讀取,因為 STDIN 未連接到終端。2.使用更多報價
你有相當數量的報價,但仍然缺少一些。主要只是在
cd
.cd "$musicPath"
還
case "$choice"
3.不要使用反引號
有時使用反引號是可以的。我經常在命令行上使用它們,因為它的輸入速度比
$()
. 但是對於腳本,最好$()
改用它。seconds="$(mdls "$currentSong"|sed -n '20p'|awk '{print $3}'|cut -d. -f1)"
4.mkdir
如果目錄已經存在,您
mkdir
將生成一個(無害但嘈雜的)錯誤。在那裡添加一個,如果它已經存在-p
,它將導致它mkdir
默默地不做任何事情mkdir -p ../Yes
是的,bash 有很多陷阱。不想苛刻,只是想改掉壞習慣。
玩得開心 :-)