¿Puedo usar la salida de tubería como argumento de script de shell?

22

Supongamos que tengo un script de shell bash llamado Myscript.shque necesita un argumento como entrada.

Pero quiero que el contenido del archivo de texto llamado text.txtsea ​​ese argumento.

He intentado esto pero no funciona:

cat text.txt | ./Myscript.sh

¿Hay alguna forma de hacer esto?

Narin
fuente

Respuestas:

19

Puede usar la salida de tubería como argumento de script de shell.

Prueba este método:

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

Si tiene más de un comando en el archivo, considere usar xargs o paralelo , por ej.

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

Tratar,

 $ 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 pueda ingresar los valores uno por uno a comli.shpartir de comli.txt.

Ranjithkumar T
fuente
0

Al leer stdin con mapfile puede restablecer los parámetros posicionales.

#!/bin/bash

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

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

(Citar "$ @" hará forlíneas de bucle en su lugar).

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

Para completar @ bac0n, que en mi humilde opinión es el único que responde correctamente la pregunta, aquí hay un breve resumen que antepondrá argumentos canalizados a su lista de argumentos de script:

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

echo $@

Ejemplo 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
aznoqmous
fuente