syntaksivirhe odottamattoman tunnuksen lähellä

olen komentosarjan kirjoittaminen komennon tuloksen lukemiseksi muuttujiin a ja b. Tämä on komentosarja

#!/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" 

ja syntaksivirhe:

line 3: syntax error near unexpected token `<" line 3: `read a b < <(awk /Application Server/ && !seen[$7]++{echo "%s ", $7} /tmp/ServerState)" 

Mutta kun kirjoitan saman komennon konsoliin, se toimii minulle ilman ongelmia.

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 

Kaikki tähän liittyvä apu on todella arvostettua.

Kommentit

  • En pysty toistamaan tätä käyttäytymistä komentojonosta. Kuinka vedot käsikirjoitukseen? Kehotan nimellä: $ ./script.sh
  • @Ketan kutsun sitä nimellä sh script.sh. Juuri nyt yritin käyttää ./script.sh-tiedostoa ja se antaa halutustuloksen. A: n arvo on epäonnistunut. B: n arvo on KÄYNNISTETTY. Kiitos paljon vastauksesta … Haluan vain tietää miksi se on erilainen, kun suoritat samaa komentosarjaa käyttämällä sh file.sh ja ./file.sh ??
  • Oletetaan, että sh älä ' salli komennon korvaamista. Yritä käynnistää bash script.sh. ./script.sh -soittajan suorittama sama kutsu suoritetaan sha-bang -koodilla, joka on komentosarjassa / bin / ** bash **.
  • @SudevJash katso: Mitä eroa on ./: n ja sh: n välillä komentosarjan suorittamiseksi?
  • @Costas Kyllä, se toimii hyvin myös bash script.sh ja saan toivotun tuloksen … Kiitos paljon …

Vastaa

sh (joka useimmissa (Debianista johdetuissa) järjestelmissä on linkitetty dash) ei salli prosessin korvaamista . Yritä kutsua bash script.sh. Sama kutsu ./script.sh suorittaa parametrilla sha-bang, joka on /bin/bash komentosarjassa.

Kommentit

  • @MichaelDurrant Ah, muokkauksesi tarkoittaa nyt päinvastaista kuin mitä tarkoitin sanoa.
  • @muru En voi ' hyväksyä muutosta t o bash. Tarkoitan tarkalleen dash. file $(which sh) tuotos /bin/sh: symbolic link to 'dash'
  • Costas, että ' s mitä minä tarkoitti. Michael Durrant muutti muokkaukseni korvaamaan dash sanalla bash. Kiitos, että korjait sen.
  • Tarkoitat prosessin korvaamista (<( echo foo )), ei komentojen korvaamista ($(echo foo)) (joka on osa POSIX-määritystä).
  • @chepner Olet oikeassa. Kiitos kommentista. Korjattu.

Vastaa

Yritin kutsua komentosarjaa nimellä sh file.sh ja sain virheen . Mutta kun vedoin saman komentosarjan kuin ./file.sh ja bash file.sh, se toimii ja antaa halutun tuloksen.

vastaus

Lisäksi voit yksinkertaisesti lisätä rivin palavan komentosarjan yläosaan:

#!/bin/bash 

Se käskee päätelaitteesi / konsolisi suorittamaan komentosarjan bash-skriptinä, ja prosessin korvaaminen ”<( cmd )” toimii hyvin.

Kommentit

  • Huomaa, että OP ' -komentosarjassa oli jo tämä shebang, mutta OP oli käynnissä se nimellä sh file.sh file.sh tai ./file.sh (katso omat vastauksensa )

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *