Script shell: commande d’appel contenant une variable

Quel est le problème avec ce script?

#!/bin/sh SONAR="~/SonarQube/bin/linux-x86-64/sonar.sh" echo "Waiting to start..." $($SONAR start) 

Il dit ./start.sh: 4: ./start.sh: ~/SonarQube/bin/linux-x86-64/sonar.sh: not found mais il existe. J’ai essayé énormément de variations, cela ne fonctionne qu’avec eval: eval $SONAR start .

Essayez plutôt ceci:

 #!/bin/sh SONAR=~/"SonarQube/bin/linux-x86-64/sonar.sh" echo "Waiting to start..." "$SONAR" start 

L’expansion de tilde est désactivée en citant (comme le globbing), vous devez donc mettre le tilde en dehors des guillemets.

La dernière ligne ne doit pas se trouver dans $() , car elle exécute d’abord la commande, puis développe le contenu et tente d’exécuter une commande exprimée par un tel contenu.

Les scripts utilisent généralement $HOME au lieu de ~ . $HOME se développera même à l’intérieur des guillemets.

 #!/bin/sh SONAR="$HOME/SonarQube/bin/linux-x86-64/sonar.sh" echo "Waiting to start..." "$SONAR" start 

Vous utilisez le ~ entre les doubles guillemets, donc cela ne va pas être interprété comme /home/whatever .

 #!/bin/sh SONAR=~/SonarQube/bin/linux-x86-64/sonar.sh