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

答案1

该脚本有很多问题,但导致您的特定问题的一个是因为您正在从管道( 的输出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如果目录已经存在,您将生成一个(无害但有噪音的)错误。-p在那里添加一个mkdir,如果它已经存在,这将导致静默不执行任何操作

mkdir -p ../Yes


是的,bash 有很多陷阱。并不是要严厉,只是想改掉坏习惯。
玩得开心 :-)

相关内容