2011-06-20 9 views
7

zrobiłemPolecenie wewnętrzne "let" nie działa w skrypcie powłoki?

a=1234 
let "a=a+1" 

na linii komend i jest w porządku. Ale gdy robię to samo w skrypcie powłoki. Wypisuje błąd, który "niech: nie znaleziono". Oto plik skryptu.

#!/bin/sh 
a=1234; 
let "a=a+1"; 
echo "$a"; 

Dzięki

+3

Najprawdopodobniej używasz innej powłoki - czy na początku skryptu masz linię prostokąta? –

+1

Może użyć 'a = 1234'? Sprawdź to: 'help | grep let' też. – marioosh

+0

'echo $ SHELL' - Co mówi? – marioosh

Odpowiedz

7

Problemem jest prawdopodobne, że /bin/sh nie jest taka sama jak, albo nie zachowują się tak samo jak normalnego powłoki. Na przykład, gdy bash jest wywoływany jako /bin/sh, zapewnia podzbiór jego normalnych funkcji.

Więc może trzeba zmienić shebang linię użyć innej powłoki:

#!/bin/bash 

lub

#!/bin/ksh 

Nie potrzebujemy średników na końcach linii .

1

To '$ a' '$ a = 1234', która zabija cię.

Powłoka wykonuje wszystkie zastępstwa $, a THEN ocenia wyrażenie. W rezultacie zobaczył "= 1234", ponieważ nie było wartości do $ a.

Użyj opcji -x, aby to zobaczyć.

 bash -x your-script
+0

Przepraszam, faktycznie nie użyłem $ a poprawionego mojego pytania. – John

0

Sprawdź swoją rzeczywistą powłokę za pomocą następującego polecenia w wierszu polecenia:

echo $ SHELL

Zapewni ona nazwę powłokę, należy, że zamiast/bin/sh na pierwszej linii twojego skryptu.

+1

Tak, problem dotyczył Shebang. Zmieniłem go na #!/Bin/bash (echo $ SHELL drukuje bash) i działa. Ale jaki jest cel tego boga? Myślałem, że wywołuje odpowiednią powłokę do wykonania skryptu. (Mam sh in/bin). A może to nie jest dozwolone w powłoce burty? – John

2

Należy użyć let a=a+1 bez cudzysłowów

-2
c=1 
d=1 
for i in `ls` 
do 
    if [ -f $i ] 
    then 
     echo "$c -> $i" 
     c=`expr $c + 1` 
    fi 
done 
c=`expr $c - 1` 
echo no. of files $c 
for i in `ls` 
do 
    if [ -d $i ] 
    then 
     echo "$d -> $i" 
     d=`expr $d + 1` 
    fi 
done 
d=`expr $d - 1` 
echo no. of direcrories $d 
+0

Witamy w Stack Overflow! Chociaż ten kod może pomóc w rozwiązaniu problemu, nie wyjaśnia, dlaczego _why_ i/lub _how_ to odpowiada na pytanie. Zapewnienie tego dodatkowego kontekstu znacznie poprawiłoby jego długoterminową wartość edukacyjną. Proszę [edytuj] swoją odpowiedź, aby dodać wyjaśnienie, w tym, jakie ograniczenia i założenia mają zastosowanie. –

0
  1. Sprawdź nazwę powłoki stosując

    echo $SHELL

  2. zmienić pierwszą linię skryptu odpowiednio do

    #!/bin/bash

    lub

    #!/bin/ksh

    zamiast #!/bin/sh.

Powiązane problemy