¿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?

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 {}

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

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.



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

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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.