bash: slechte vervanging

Dit bash-script geeft me een slechte vervangingsfout op ubuntu. Alle hulp wordt zeer op prijs gesteld.


Antwoord 1, autoriteit 100%

De standaard shell (/bin/sh) onder Ubuntu verwijst naar dash, niet naar bash.

me@pc:~$ readlink -f $(which sh)
/bin/dash

Dus als je chmod +x your_script_file.sh en het vervolgens uitvoert met ./your_script_file.sh, of als je het uitvoert met bash your_script_file.sh, het zou goed moeten werken.

Het uitvoeren met sh your_script_file.sh zal niet werken omdat de hashbang-regel wordt genegeerd en het script wordt geïnterpreteerd door dash, dat die tekenreeksvervanging niet ondersteunt syntaxis.


Antwoord 2, autoriteit 37%

Ik had hetzelfde probleem. Zorg ervoor dat uw script geen

. heeft

#!/bin/sh 

bovenaan je script. In plaats daarvan moet u

. toevoegen

#!/bin/bash

Antwoord 3, autoriteit 21%

Voor anderen die hier aankomen, zal dit exacte bericht ook verschijnen wanneer de env-variabele syntaxis voor opdrachten wordt gebruikt, bijvoorbeeld ${which sh} in plaats van de juiste $(which sh)


Antwoord 4, autoriteit 9%

Uw scriptsyntaxis is geldig bash en goed.

Mogelijke oorzaken van de storing:

  1. Je bash is niet echt bash maar ksh of een andere shell die de parametervervanging van bash niet begrijpt. Omdat je script er goed uitziet en werkt met bash.
    Voer ls -l /bin/bash uit en controleer of het echt bash is en niet symbolisch gekoppeld is aan een andere shell.

  2. Als je bash op je systeem hebt, voer je je script misschien op de verkeerde manier uit, zoals: ksh script.sh of sh script.sh (en je standaard shell is geen bash). Aangezien je de juiste shebang hebt, zou het goed moeten zijn als je bash ./script.sh of bash ./script.sh hebt.


Antwoord 5, autoriteit 3%

Probeer het script expliciet uit te voeren met het bash-commando in plaats van het alleen als uitvoerbaar bestand uit te voeren.


Antwoord 6, autoriteit 3%

Zorg er ook voor dat je geen lege tekenreeks hebt voor de eerste regel van je script.

d.w.z. zorg ervoor dat #!/bin/bash de allereerste regel van je script is.


Antwoord 7, autoriteit 3%

Niet relevant voor uw voorbeeld, maar u kunt ook de fout Bad substitution in Bash krijgen voor elke vervangingssyntaxis die Bash niet herkent. Dit kan zijn:

  • Verdwaalde witruimte. bijv. bash -c '${x }'
  • Een typfout. bijv. bash -c '${x;- }'
  • Een functie die in een latere Bash-versie is toegevoegd. bijv. bash -c '${x@Q}' voor Bash 4.4.

Als je meerdere vervangingen in dezelfde uitdrukking hebt, is Bash misschien niet erg behulpzaam bij het lokaliseren van de problematische uitdrukking. Bijv.:

$ bash -c '"${x } multiline string
$y"'
bash: line 1: ${x } multiline string
$y: bad substitution

Antwoord 8

Beide – bash of dash – werken, maar de syntaxis moet zijn:

FILENAME=/my/complex/path/name.ext
NEWNAME=${FILENAME%ext}new

Antwoord 9

Ik was twee keer een dollarteken aan het toevoegen in een uitdrukking met accolades in bash:

cp -r $PROJECT_NAME ${$PROJECT_NAME}2

in plaats van

cp -r $PROJECT_NAME ${PROJECT_NAME}2

Antwoord 10

Ik heb ontdekt dat dit probleem wordt veroorzaakt door het gemarkeerde antwoord of door een regel of spatie voor de bash-declaratie


Antwoord 11

Het lijkt erop dat “+x” problemen veroorzaakt:

root@raspi1:~# cat > /tmp/btest
#!/bin/bash
jobname="job_201312161447_0003"
jobname_pre=${jobname:0:16}
jobname_post=${jobname:17}
root@raspi1:~# chmod +x /tmp/btest
root@raspi1:~# /tmp/btest
root@raspi1:~# sh -x /tmp/btest
+ jobname=job_201312161447_0003
/tmp/btest: 4: /tmp/btest: Bad substitution

Antwoord 12

in mijn geval (onder ubuntu 18.04), heb ik $( ${} ) gemengd dat prima werkt:

BACKUPED_NB=$(ls ${HOST_BACKUP_DIR}*${CONTAINER_NAME}.backup.sql.gz | wc --lines)

volledig voorbeeld hier.

LEAVE A REPLY

Please enter your comment!
Please enter your name here

17 − 14 =

Other episodes