Bash

Bash 腳本不讀取輸入

  • August 12, 2012

我有一個腳本,它假設在後台執行一個命令,它就是這樣做的。問題是當腳本遇到讀取命令時,它不會暫停並接受輸入。這裡是:

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 有很多陷阱。不想苛刻,只是想改掉壞習慣。
玩得開心 :-)

引用自:https://unix.stackexchange.com/questions/45294