syntaksfeil nær uventet token `< '

Jeg er skrive et skript for å lese utdataene fra en kommando til variabel a og b. Dette er 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" 

og får syntaksfeilen 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 jeg skriver den samme kommandoen i konsollen, fungerer den for meg uten problemer.

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 hjelp til dette blir virkelig verdsatt.

Kommentarer

  • Jeg kan ikke gjengi denne oppførselen fra skriptet. Hvordan påkaller du manuset? Jeg påkaller som: $ ./script.sh
  • @Ketan Jeg påkaller det som sh script.sh. Akkurat nå prøvde jeg å bruke ./script.sh og det gir ønsket resultatet. Verdien til a mislykkes Verdien til b er STARTET. Tusen takk for svaret … Vil bare vite hvorfor det er annerledes mens du utfører samme skript ved hjelp av sh file.sh og ./file.sh ??
  • Anta sh don ' t tillat kommandosubstitusjon. Prøv å påkalle av bash script.sh. Samme kall av ./script.sh utføres med sha-bang som er / bin / ** bash ** i skriptet.
  • @SudevJash se: Hva er forskjellen mellom ./ og sh for å kjøre et skript?
  • @Costas Ja, det fungerer fint selv med bash script.sh og jeg får ønsket utgang … Tusen takk …

Svar

sh (som i de fleste (fra Debian-avledede) systemer er knyttet til dash) tillater ikke prosessubstitusjon . Prøv å påkalle av bash script.sh. Samme anrop av ./script.sh utfører med sha-bang som er /bin/bash i skriptet ditt.

Kommentarer

  • @MichaelDurrant Ah, din modifikasjon betyr nå det motsatte av det jeg mente å si.
  • @muru Jeg kan ' t godta endringer t o bash. Jeg mener dash nøyaktig. file $(which sh) utgang /bin/sh: symbolic link to 'dash'
  • Costas, at ' er det jeg betydde. Michael Durrant endret redigeringen min for å erstatte dash med bash. Takk for at du fikser det.
  • Du mener prosessubstitusjon (<( echo foo )), ikke kommandosubstitusjon ($(echo foo)) (som er en del av POSIX-spesifikasjonen).
  • @chepner Du har rett. Takk for kommentaren. Reparert.

Svar

Jeg prøvde å påkalle skriptet som sh file.sh og fikk feilen . Men når jeg påkalte samme skript som ./file.sh og bash file.sh, fungerer det og gir ønsket resultat.

Svar

I tillegg kan du enkelt legge til linjen nedenfor øverst i skriptet:

#!/bin/bash 

Den forteller terminalen / konsollen din å utføre skriptet ditt som bash-skript, og at prosessubstitusjonen din <( cmd ) «vil fungere bra.

Kommentarer

  • Merk at OP ' skriptet allerede hadde den shebang, men OP var i gang det som sh file.sh i stedet for file.sh eller ./file.sh (se sitt eget svar )

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *