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
.
[email protected]:~$ 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:
-
Je
bash
is niet echt bash maarksh
of een andere shell die de parametervervanging van bash niet begrijpt. Omdat je script er goed uitziet en werkt met bash.
Voerls -l /bin/bash
uit en controleer of het echt bash is en niet symbolisch gekoppeld is aan een andere shell. -
Als je bash op je systeem hebt, voer je je script misschien op de verkeerde manier uit, zoals:
ksh script.sh
ofsh 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
ofbash ./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 '${[email protected]}'
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:
[email protected]:~# cat > /tmp/btest
#!/bin/bash
jobname="job_201312161447_0003"
jobname_pre=${jobname:0:16}
jobname_post=${jobname:17}
[email protected]:~# chmod +x /tmp/btest
[email protected]:~# /tmp/btest
[email protected]:~# 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.