Bash-Skript liest keine Eingaben


8

Ich habe ein Skript, das einen Befehl im Hintergrund ausführen soll, und das tut es. Das Problem ist, dass das Skript beim Lesen nicht pausiert und keine Eingaben akzeptiert. Hier ist es:

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

In Bash können Sie die Eingabeaufforderung im read -p "where is yo music? " musicPath
Lesebefehl

Antworten:


16

Es gibt zahlreiche Probleme mit diesem Skript, aber das Problem, das Ihr spezifisches Problem verursacht, ist, dass Sie aus einer Pipe lesen (die Ausgabe von ls).

1. Nicht analysierenls

Verwenden Sie dies stattdessen

for currentSong in *; do
  ...
done

Abgesehen von den zahlreichen Gründen, die Sie nicht analysieren sollten ls, liegt das Problem darin, dass STDIN mit dem Ausgang von verbunden ist ls. Wenn Sie also a ausgeben read, kann es nicht vom Terminal lesen, da STDIN nicht mit dem Terminal verbunden ist.


2. Verwenden Sie mehr Anführungszeichen

Sie haben eine ganze Reihe von Zitaten verteilt, aber es fehlen noch einige. Hauptsächlich nur auf der cd.

cd "$musicPath"

ebenfalls

case "$choice"


3. Verwenden Sie keine Backticks

Die Verwendung von Backticks ist manchmal in Ordnung. Ich benutze sie häufig in der Kommandozeile, da sie schneller zu tippen sind als $(). Für Skripte empfiehlt es sich jedoch, $()stattdessen zu verwenden .

seconds="$(mdls "$currentSong"|sed -n '20p'|awk '{print $3}'|cut -d. -f1)"


4. mkdir

Sie mkdirwerden einen (harmlosen, aber lauten) Fehler erzeugen, wenn die Verzeichnisse bereits vorhanden sind. Fügen Sie -pdort ein hinzu, das dazu führt, dass der mkdirBenutzer nichts tut, wenn er bereits vorhanden ist

mkdir -p ../Yes


Ja, es gibt viele Fallstricke bei Bash. Nicht versuchen, hart zu sein, sondern nur schlechte Gewohnheiten zu brechen.
Habe Spaß :-)


Danke für alle Tipps! Ich liebe dieses Zeug, also keine Sorge. Ich liebe es immer, neue Dinge zu lernen (:
Cade
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.