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
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
- Související: unix.stackexchange.com/questions/40786/…
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)