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?

Narin
źródło

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 {}
zzart
źródło
2

Jeśli masz więcej niż jedno polecenie w pliku, rozważ użycie xargs lub równoległego , np

xargs -d '\n' Myscript.sh < text.txt
parallel -j4 Myscript.sh < text.txt
reinierpost
źródło
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.

Ranjithkumar T.
źródło
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
bac0n
źródło
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
aznoqmous
źródło