Beágyazott If utasítások a Shell szkriptben

Elnézését kérem, ha a problémámat már feltették más bejegyzésekben, de nem találtam ilyet. Írok egy kis shell parancsfájl, amely megköveteli, hogy beágyazott if utasítást írjak. Nem igazán vagyok biztos benne, hogy jól csinálom-e. Nincsenek hibáim, de a program nem úgy működik, ahogy elvárom. Amit szeretnék: Ha a fájl már MasterFile.txt fájlban van, akkor a felhasználónak lehetősége van egy másik adatkészlet felvételére is, mondván: y vagy Y, vagy mondja ki a n vagy N parancsot a program leállításához. Probléma: A szkript nem fejeződik be . Ha a fájl nem létezik a MasterFile.txt helyen, akkor vegye be az adatkészletet. Itt van a kód:

if grep -q "dicounter_${string1}_from_${string2}" MasterFile.txt; then { echo "dicounter_${string1}_from_${string2} already exists in the MasterFile. Would you like to proceed?" read string3 if "${string3}" = "Y" || "${string3}" = "y"; then { screen -S trans -L /dev/ttyACM0 screen -S trans -X stuff "s"$(echo -ne "\015") sleep 8s screen -S trans -X quit } else{return} fi else{ #opening screen & begin analysis screen -S trans -L /dev/ttyACM0 screen -S trans -X stuff "s"$(echo -ne "\015") sleep 8s screen -S trans -X quit } fi 

Megjegyzések

  • Ööö … ez milyen héj? sh -típusú héjak ne ' ne használja a { ... } elemeket a blokkokhoz.
  • Hiszek abban, hogy bash. A program csak egy if utasítással működött jól. Nem gondolom, hogy ' nem a {...} probléma. Valami nem stimmel a beágyazott if
  • megvalósításának módjában. Most kapok egy hibát, amely szerint valami nem stimmel az utolsó else utasítás
  • @Kusalananda, nos, használhatná őket parancsok csoportosításához ott is, másutt is …
  • @Ptheguy if "${string3}" = 'Y' a string3 tartalmát veszi egy parancs neveként, és két argumentummal futtatja = és Y

Válasz

Gyors válasz írjon hagyományosabb szintaxissal:

if grep -q "dicounter_${string1}_from_${string2}" MasterFile.txt; then echo "dicounter_${string1}_from_${string2} already exists in the MasterFile. Would you like to proceed?" read string3 if [[ "${string3^}" == "Y" ]]; then screen -S trans -L /dev/ttyACM0 screen -S trans -X stuff "s"$(echo -ne "\015") sleep 8s screen -S trans -X quit else exit 0 fi else #opening screen & begin analysis screen -S trans -L /dev/ttyACM0 screen -S trans -X stuff "s"$(echo -ne "\015") sleep 8s screen -S trans -X quit fi 

Úgy tűnik, hogy itt nincsenek deklarált funkciói, ezért return nem érvényes erre a felhasználási esetre. Feltételeztem, hogy a megkérdezett kérdésre adott nem megerősítő válasz a teljes szkript megszakítását jelenti, ezért az exit használatát.

A ${variable^} a $variable első karakterét, ha egy betű, nagybetűvé teszi, ami egyszerűsíti a válaszellenőrzést.

Megjegyzések

  • Tehát két dolog: egy, ha beírok y, akkor kilép, és függetlenül attól, hogy mit írok be, megkapom a következő hiba ./test/sh: line19: [[variable: command not found
  • győződjön meg arról, hogy a szkript első sora #!/bin/bash, és nem #!/bin/sh. A [[ [...] ]] konstrukciók bash ism.
  • igen, a fejléc helyes
  • És van szóköz [[ és "${string3^}" között?
  • Ennyi volt !! Még egyszer köszönöm. Ha van ideje, megtanítaná, hogy mit jelent a [[, és miért lehet olyan fontos egy szóköz?

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük