"Let" interne Shell-Befehl funktioniert nicht in einem Shell-Skript? - Shell, Unix

Ich tat

a=1234
let "a=a+1"

auf der Kommandozeile und es ist in Ordnung. Aber wenn ich das gleiche in einem Shell-Skript. Es gibt einen Fehler aus, der "let: not found". Hier ist die Skriptdatei.

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

Vielen Dank,

Antworten:

7 für die Antwort № 1

Das Problem ist wahrscheinlich das /bin/sh ist nicht das gleiche oder verhält sich nicht wie Ihre normale Shell. Zum Beispiel wann bash wird als aufgerufen /bin/shbietet es eine Teilmenge seiner normalen Funktionen.

Möglicherweise müssen Sie Ihre Shebang-Linie ändern, um eine andere Shell zu verwenden:

#!/bin/bash

oder

#!/bin/ksh

Sie brauchen nicht die Semikolons an den Enden der Linien.


8 für die Antwort № 2

Verwende nicht let. Benutzen POSIX arithmetische Erweiterung: a=$(($a+1)). Dies funktioniert garantiert in jeder POSIX-konformen Shell.


3 für die Antwort № 3

Siehe unter: http://www.hlevkin.com/Shell_progr/hellobash.htm

Das Richtige ist:

a=1234;
b=1;
a=`expr $a + $b`;

2 für die Antwort № 4

Du solltest benutzen let a=a+1 ohne Anführungszeichen


1 für die Antwort № 5

Es ist das "$ a" von "$ a = 1234", das dich umbringt.

Die Shell führt alle $ Substitutionen aus und THEN wertet den Ausdruck aus. Als Ergebnis wurde "= 1234" angezeigt, weil $ a keinen Wert hatte.

Verwenden Sie -x, um dies zu sehen.

  bash -x dein-script

0 für die Antwort № 6

Überprüfen Sie Ihre tatsächliche Shell mit dem folgenden Befehl in der Befehlszeile:

Echo $ SHELL

Sie erhalten einen Shell-Namen, den Sie anstelle von / bin / sh in der ersten Zeile Ihres Skripts verwenden.


0 für die Antwort № 7
  1. Überprüfen Sie den Shell-Namen mit

    echo $SHELL

  2. Ändern Sie die erste Zeile des Skripts entsprechend in

    #!/bin/bash

    oder

    #!/bin/ksh

    Anstatt von #!/bin/sh.


-2 für die Antwort № 8
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

Speisekarte