Czy mogę użyć danych wyjściowych potoku jako argumentu skryptu powłoki?


22

Załóżmy, że mam skrypt powłoki bash o nazwie, Myscript.shktóry wymaga jednego argumentu jako danych wejściowych.

Ale chcę, aby treść pliku tekstowego text.txtbyła tym argumentem.

Próbowałem tego, ale to nie działa:

cat text.txt | ./Myscript.sh

Czy jest na to sposób?

Odpowiedzi:



19

Możesz użyć danych wyjściowych potoku jako argumentu skryptu powłoki.

Wypróbuj tę metodę:

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


0

Próbować,

 $ 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

więc można wprowadzić wartości jeden po drugim do comli.shz comli.txt.



0

Czytając stdin za pomocą pliku map, możesz ponownie ustawić parametry pozycji.

#!/bin/bash

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

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

(Cytując „$ @” forzamiast tego utworzymy linie pętli).

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

0

Aby wypełnić @ bac0n, który jako jedyny IMHO poprawnie odpowiedział na pytanie, oto krótka linijka, która dołączy argumenty potokowe do listy argumentów skryptu:

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

echo $@

Przykładowe zastosowanie:

$ ./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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.