Učím se skriptování Shell pro diplom v IT, které právě dělám. Snažím se napsat malý skript, který přidá dvě čísla, jak je ukázáno v jednom z tutoriálů, které jsme dostali.

echo "Enter two numbers" read num1 num2 sum = "expr $num1 + $num2" echo "The sum is = $sum" 

Když to ale dám oprávnění ke spuštění a spuštění skriptu, dává mi tuto chybu.

sum: =. No such file or directory. sum: expr $num1 + $num2: No such file or directory 

zde zadejte popis obrázku

Zkusil jsem to spustit na Ubuntu i Fedoře, ale došlo ke stejné chybě. Může mi někdo prosím říct, co mi zde chybí?

Komentáře

Odpověď

Nejprve se musíte zbavit mezer pro přiřazení, např.

sum="expr $num1 + $num2" 

pak musíte změnit " na ` nebo ještě lépe na $():

sum=$(expr "$num1" + "$num2") 

namísto použití expr můžete také provést výpočet ulation přímo ve vašem prostředí:

sum=$((num1 + num2)) 

Komentáře

  • Pokud je motivace k použití expr místo $((...)) je touha být přenosný do klasického prostředí Bourne, pak je ' dobrý nápad vyhnout se také $(...).
  • @AlanCurry existují nějaké shelly, které nepodporují $()? Pokud vím, vyžaduje to posix, např. všechny skořepiny kompatibilní s posixem by měly podporovat $()
  • @UlrichDangel Původní prostředí Bourne ' nemělo $(…), ale už asi vymřel (možná někdo někde stále běží /bin/sh na systému Solaris).
  • C Shell nefunguje t support $(…) –– nebo alespoň ne všechny verze.
  • Jaký je účel mít uvozovky kolem proměnných?

Odpověď

Pravděpodobně jste špatně přečetli zpětné lístky jako jednoduché uvozovky v řádku:

sum = "expr $num1 + $num2"

Viz Gregova Wiki o tom, jak místo toho používat $(...).

Toto funguje podle očekávání:

sum=$(expr "$num1" + "$num2")

Všimněte si, že kolem znaménka rovnosti (přiřazení proměnné) nejsou žádné mezery.

Answer

expr je externí program používaný Bourne shell (tj. sh). Bourneův shell původně neměl žádný mechanismus pro provádění jednoduché aritmetiky. Využívá expr externí program pomocí backticku.

Backtick ( `) se ve skutečnosti nazývá substituce příkazů. Substituce příkazů je mechanismus, kterým prostředí provádí danou sadu příkazů a poté nahrazuje jejich výstup v místo příkazů.

sum=`expr $num1 + $num2` 

V bash (bourne again shell) má následující systax, nebude používat extrnal program expr.

sum=$((num1+num2)) 

Pokud chceme použít externí program expr. máme následující systax:

sum=$(expr $num1 + $num2) 

Napsat komentář

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