10
votes

La commande de shell interne "let" ne fonctionne pas dans un script shell?

J'ai fait xxx

sur la ligne de commande et c'est bien. Mais quand je fais la même chose dans un script shell. Il imprime une erreur qui "laisse: non trouvé". Voici le fichier de script. xxx

merci,


9 commentaires

Vous utilisez probablement une coquille différente - avez-vous une ligne de shebang au début de votre script?


Peut-être utiliser a = 1234 ? Vérifiez ceci: Aide | Grep Laissez aussi.


Echo $ shell - Qu'est-ce que ça dit?


Cette première ligne n'est pas valide. Êtes-vous sûr que vous écrivez un script shell?


Oui je mets un shebang. #! / bin / sh


Si vous utilisez vraiment UNIX et non Linux, alors vous utilisez # ~ / bin / sh vous obtient la coquille de Bourne. De votre ligne de commande (quand cela fonctionne avec laisse ), tapez echo $ shell et utilisez-le pour votre #! / Bin /... . Bonne chance.


Pouvez-vous croire ce gars ???? Github.com/drbeco/killgradygrady/issues/1


Je ne suis pas responsable de ce problème GitHub ;-). Ce n'est pas moi. @Drbeco lol


Bonjour @john, je suis content que ce n'était pas toi, merci de clarifier cela. ;) La question est toujours la question: pouvez-vous croire que gars!? Lol passe une bonne journée. (J'ai mis à jour le sujet dans la question pour ne pas impliquer que c'était vous ou donner cette impression)


8 Réponses :


1
votes

C'est le '$ a' de '$ a = 1234' qui vous tue.

La coque fait toutes les substitutions $, puis évalue l'expression. En conséquence, il a vu "= 1234" car il n'y avait pas de valeur à $ a. P>

Utiliser -x pour voir cela. P>

  bash -x your-script


0 commentaires

9
votes

Le problème est probablement que / bin / sh n'est pas identique à celui ou ne se comporte pas de la même manière que votre coquille normale. Par exemple, lorsque Bash est appelé comme / bin / sh , il fournit un sous-ensemble de ses fonctions normales.

Donc, vous devrez peut-être changer votre ligne de shebang vers Utilisez une enveloppe différente: xxx

ou xxx

Vous n'avez pas besoin des semi-couches aux extrémités de la lignes.


0 commentaires

0
votes

Vérifiez votre shell réel avec la commande suivante dans la ligne de commande: de
de
echo $ shell

Il fournira un nom de shell, utilisez-le au lieu de / bin / sh à la première ligne de votre script.


1 commentaires

Oui, le problème était avec le shebang. Je l'ai changé à #! / Bin / Bash (Echo $ Shell Print Bash) et ça marche. Mais quel est le but de Shebang alors? Je pensais que cela invoque la coquille appropriée pour exécuter le script. (J'ai SH in / bin). Ou est-ce que laisse n'est pas pris en charge dans la coquille de Bourne?




2
votes

Vous devez utiliser let a = A + 1 sans guillemets


0 commentaires

14
votes

Ne pas utiliser laisser . Utilisez expansion arithmétique POSIX : a = $ (( $ A + 1)) . Ceci est garanti de travailler dans n'importe quel shell compatible POSIX.


1 commentaires

C'est la meilleure solution



-2
votes
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

1 commentaires

Bienvenue dans le débordement de la pile! Bien que ce code puisse aider à résoudre le problème, il n'explique pas pourquoi et / ou comment répond à la question. Fournir ce contexte supplémentaire améliorerait de manière significative sa valeur éducative à long terme. S'il vous plaît Modifier Votre réponse à ajouter une explication, y compris quelles limitations et hypothèses s'appliquent.



0
votes
  1. Vérifiez le nom du shell en utilisant

    echo $ shell

  2. Modifiez la première ligne du script en conséquence vers

    #! / bin / bash

    ou

    #! / bin / ksh

    au lieu de #! / bin / sh .


0 commentaires