Jag är skriva ett skript för att läsa utdata från ett kommando till variabel a och b. Detta är skriptet
#!/bin/bash read a b < <(awk "/Application Server/ && !seen[$7]++{printf "%s ", $7}" /tmp/ServerState) echo "The value of a is $a" echo "The value of b is $b"
och får syntaxfelet som:
line 3: syntax error near unexpected token `<" line 3: `read a b < <(awk /Application Server/ && !seen[$7]++{echo "%s ", $7} /tmp/ServerState)"
Men när jag skriver samma kommando i konsolen fungerar det för mig utan problem.
app@user:/tmp> read a b < <(awk "/Application Server/ && !seen[$7]++{printf "%s ", $7}" /tmp/ServerState) app@user:/tmp> echo $a FAILED app@user:/tmp> echo $b STARTED
All hjälp med detta uppskattas verkligen.
Kommentarer
Svar
sh (som i de flesta (från Debian härledda) system är länkade till dash) tillåter inte processersättning . Försök anropa av bash script.sh. Samma anrop av ./script.sh körs med sha-bang vilket är /bin/bash i ditt skript.
Kommentarer
- @MichaelDurrant Ah, din modifiering betyder nu motsatsen till vad jag tänkte säga.
- @muru Jag kan ' t acceptera modifiering t o
bash. Jag menardashexakt.file $(which sh)output/bin/sh: symbolic link to 'dash' - Costas, att ' är vad jag menade. Michael Durrant ändrade min redigering för att ersätta
dashmedbash. Tack för att du fixade det. - Du menar processersättning (
<( echo foo )), inte kommandosubstitution ($(echo foo)) (vilket är en del av POSIX-specifikationen). - @chepner Du har rätt. Tack för din kommentar. Reparerad.
Svar
Jag försökte åberopa skriptet som sh file.sh och fick felet . Men när jag åberopade samma skript som ./file.sh och bash file.sh fungerar det och ger önskat resultat.
Svar
Dessutom kan du enkelt lägga till raden nedan längst upp i skriptet:
#!/bin/bash
Den berättar för din terminal / konsol att köra ditt skript som bash-skript, och än att din processersättning ”<( cmd )” fungerar bra.
Kommentarer
- Observera att OP ' s skript redan hade den shebang, men OP kördes det som
sh file.shistället förfile.sheller./file.sh(se sitt eget svar )
$ ./script.shshdon ' t tillåt kommandosubstitution. Försök åberopa medbash script.sh. Samma anrop av./script.shkörs medsha-bangvilket är / bin / ** bash ** i ditt skript.