Posso usar a saída de pipe como um argumento de script de shell?


22

Suponha que eu tenha um script de shell bash chamado Myscript.shque precise de um argumento como entrada.

Mas quero que o conteúdo do arquivo de texto chamado text.txtseja esse argumento.

Eu tentei isso, mas não funciona:

cat text.txt | ./Myscript.sh

Existe uma maneira de fazer isso?

Respostas:



19

Você pode usar a saída do pipe como um argumento de script de shell.

Tente este método:

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

2

Se você tiver mais de um comando no arquivo, considere usar xargs ou paralelo , por exemplo

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

0

Experimentar,

 $ 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

para que você possa inserir os valores um a um para comli.shpartir comli.txt.



0

Lendo stdin com o mapfile, você pode redefinir os parâmetros posicionais.

#!/bin/bash

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

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

(Citar "$ @" criará forlinhas de loop).

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

0

Para concluir @ bac0n, que IMHO é o único a responder corretamente à pergunta, aqui está um pequeno atalho que anexará argumentos direcionados à sua lista de argumentos de script:

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

echo $@

Exemplo de uso:

$ ./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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.