Vnořená prohlášení ve skriptu Shell

Omlouvám se, pokud již byl můj problém požádán v jiných příspěvcích, ale nebyl jsem schopen najít žádné. Píšu malý shell skript, který vyžaduje, abych napsal vnořený příkaz if. Nejsem si úplně jistý, že to dělám správně. Nedochází k žádným chybám, ale program nefunguje tak, jak jsem očekával. To, co chci, je: Pokud je soubor již v MasterFile.txt, má uživatel možnost buď vzít jinou sadu dat vyslovením y nebo Y nebo vyslovením n nebo N program ukončit. Problém: Skript se nekončí . Pokud soubor v MasterFile.txt neexistuje, vezměte datovou sadu. Tady je 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 

Komentáře

  • Hm … co je to za shell? sh -typové skořápky nepoužívejte ' pro bloky { ... }.
  • Věřím jeho bash. Program fungoval dobře s pouhým jedním příkazem if. ' si nemyslím, že {...} je problém. Ve způsobu, jakým jsem implementoval vnořené if
  • nyní se vyskytla chyba, nyní se zobrazuje chyba, která říká, že s posledním prohlášení
  • @Kusalananda, můžete je použít pro seskupování příkazů tam i jinde …
  • @Ptheguy if "${string3}" = 'Y' vezme obsah string3 jako název příkazu a spustí jej se dvěma argumenty = a Y

odpověď

Rychlá re psát s konvenčnější syntaxí:

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 

Zdá se, že zde nejsou deklarovány žádné funkce, takže return není pro tento případ použití platný. Předpokládal jsem, že nepotvrzující odpověď na vaši otázku s výzvou má zrušit celý skript, proto použití exit.

Konstrukční prvek ${variable^} vynutí, aby první znak $variable, pokud je písmeno, byl psán velkými písmeny, což zjednodušuje kontrolu odezvy.

Komentáře

  • Takže dvě věci: jedna, když zadám y to skončí, a bez ohledu na to, co zadám, dostanu následující chyba ./test/sh: line19: [[variable: command not found
  • zajistit, aby první řádek skriptu byl #!/bin/bash, a ne #!/bin/sh. [[ [...] ]] konstrukty jsou bash ism.
  • ano, záhlaví je správné
  • mezi mezerami [[ a "${string3^}"?
  • to bylo ono !! Ještě jednou děkuji. Pokud máte čas, nevadí vám naučit mě, co [[ znamená a proč může být prostor tak důležitý?

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *