2013-10-18 3 views
8

Non posso credere di aver passato 1,5 ore a qualcosa di così semplice come questo. Sto scrivendo uno molto script di shell semplice che esegue il greps di un file, memorizza l'output in una variabile e fa scattare la variabile su STDOUT.L'uso di grep nello script della shell dà errore di file non trovato

Ho controllato il comando grep con la regex sulla riga di comando, e funziona benissimo. Ma per qualche ragione, il comando grep non funziona nello script della shell.

Ecco lo script che ho scritto fino:

#!/bin/bash 

tt=grep 'test' $1 
echo $tt 

ho corso questo con il seguente comando: ./myScript.sh testingFile. Stampa solo una riga vuota.

  • Ho già usato chmod e reso eseguibile lo script.
  • Ho verificato che la variabile PATH contiene /bin.
  • verificato che echo $SHELL/bin/bash
  • Nella mia disperazione, ho provato tutte le combinazioni di:
    • tt=grep 'test' "$1"
    • echo ${tt}
    • Non utilizzando l'argomento della riga di comando a tutti, e hardcoding il nome del file tt=grep 'test' testingFile
  • Ho trovato questo: grep fails inside bash script but works on command line e utilizzato anche dos2unix per rimuovere eventuali ritorni a capo.
  • Inoltre, quando si tenta di utilizzare una qualsiasi delle opzioni di grep, come: tt=grep -oE 'test' testingFile, ottengo un errore che dice: ./out.sh: line 3: -oE: command not found.
  • Questo è pazzesco.
+0

Quello che stai facendo è temporaneamente (solo per questo comando) impostando la variabile di ambiente 'tt' alla stringa' grep' ed eseguendo il comando 'test' con l'argomento preso dal contenuto di' $ 1' (cioè , il primo parametro di script) (e con la variabile di ambiente 'tt' impostata) –

risposta

13

è necessario utilizzare la sostituzione di comando:

#!/usr/bin/env bash 

test=$(grep 'foo' "$1") 
echo "$test" 

La sostituzione di comando permette l'output di un comando per sostituire il comando stesso. La sostituzione di comando si verifica quando un comando è racchiuso in questo modo:

$(command) 

o come questa utilizzando backticks:

`command` 

Bash effettua l'espansione eseguendo il comando e rimpiazzando la sostituzione di comando con lo standard output del comando , con qualsiasi nuova riga finale eliminata. Le nuove righe incorporate non vengono eliminate, ma possono essere rimosse durante la suddivisione in parole.

La versione $() di solito è preferibile perché permette la nidificazione:

$(command $(command)) 

Per ulteriori informazioni leggere la sezione command substitution in man bash.

+0

Wow. Grazie mille. Solo curioso, è diverso per zsh? – Bonz0

Problemi correlati