Posso usare l'output di pipe come argomento di script di shell?


22

Supponiamo di avere uno script shell bash chiamato Myscript.shche necessita di un argomento come input.

Ma voglio che il contenuto del file di testo chiamato text.txtsia tale argomento.

Ho provato questo ma non funziona:

cat text.txt | ./Myscript.sh

C'è un modo per fare questo?

Risposte:



19

È possibile utilizzare l'output di pipe come argomento di script di shell.

Prova questo metodo:

cat text.txt | xargs -I {} ./Myscript.sh {}

2

Se hai più di un comando nel file, considera l'utilizzo di xargs o parallelo , ad es

xargs -d '\n' Myscript.sh < text.txt
parallel -j4 Myscript.sh < text.txt

0

Provare,

 $ cat comli.txt
 date
 who
 screen
 wget

 $ cat comli.sh
 #!/bin/bash
 which $1

 $ for i in `cat comli.txt` ; do ./comli.sh $i ; done

così puoi inserire i valori uno a uno a comli.shda comli.txt.



0

Leggendo stdin con mapfile è possibile reimpostare i parametri posizionali.

#!/bin/bash

[[ -p /dev/stdin ]] && { mapfile -t; set -- "${MAPFILE[@]}"; }

for i in $@; do
    echo "$((++n)) $i"
done

(Citando "$ @" si forcreeranno invece delle linee di loop).

$ cat test.txt | ./script.sh
1 one
2 two
3 tree

0

Per completare @ bac0n quale IMHO è l'unico a rispondere correttamente alla domanda, ecco una breve riga che anteporrà gli argomenti convogliati all'elenco degli argomenti dello script:

#!/bin/bash
args=$@
[[ -p /dev/stdin ]] && { mapfile -t; set -- "${MAPFILE[@]}"; set -- $@ $args; }

echo $@

Esempio di utilizzo:

$ ./script.sh arg1 arg2 arg3
> arg1 arg2 arg3

$ echo "piped1 piped2 piped3" | ./script.sh
> piped1 piped2 piped3

$ echo "piped1 piped2 piped3" | ./script.sh arg1 arg2 arg3
> piped1 piped2 piped3 arg1 arg2 arg3
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.