syntaxfel nära oväntat token `< '

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

  • Jag kan inte återge detta beteende från skriptet. Hur åberopar du manuset? Jag åberopar som: $ ./script.sh
  • @Ketan Jag åberopar det som sh script.sh. Just nu försökte jag använda ./script.sh och det ger önskat resultat. Värdet på a FELAR Värdet på b BÖRJAS. Tack så mycket för svaret … Vill bara veta varför det är annorlunda när du kör samma skript med sh file.sh och ./file.sh ??
  • Antag att sh don ' t tillåt kommandosubstitution. Försök åberopa med bash script.sh. Samma anrop av ./script.sh körs med sha-bang vilket är / bin / ** bash ** i ditt skript.
  • @SudevJash se: Vad är skillnaden mellan ./ och sh för att köra ett skript?
  • @Costas Ja, det fungerar bra även med bash script.sh och jag får önskad utgång … Tack så mycket …

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 menar dash exakt. 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 dash med bash. 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.sh istället för file.sh eller ./file.sh (se sitt eget svar )

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *