Kann ich die Pipe-Ausgabe als Shell-Skript-Argument verwenden?

22

Angenommen, ich habe ein Bash-Shell-Skript mit dem Namen Myscript.sh, das ein Argument als Eingabe benötigt.

Aber ich möchte, dass der Inhalt der aufgerufenen Textdatei text.txtdieses Argument ist.

Ich habe es versucht, aber es funktioniert nicht:

cat text.txt | ./Myscript.sh

Gibt es eine Möglichkeit, dies zu tun?

Narin
quelle

Antworten:

19

Sie können die Pipe-Ausgabe als Shell-Skriptargument verwenden.

Versuchen Sie diese Methode:

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

Wenn Sie mehr als einen Befehl in der Datei haben, ziehen Sie die Verwendung von xargs oder parallel in Betracht , z

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

Versuchen,

 $ 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

so können Sie die Werte eins nach dem anderen eingeben comli.shaus comli.txt.

Ranjithkumar T
quelle
0

Durch Lesen von stdin mit mapfile können Sie die Positionsparameter zurücksetzen.

#!/bin/bash

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

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

(Wenn Sie "$ @" angeben, forwerden stattdessen Schleifenlinien erstellt).

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

Um @ bac0n zu vervollständigen, der IMHO als einziger die Frage richtig beantwortet, finden Sie hier einen kurzen Zeilenumbruch, der Ihrer Skriptargumentliste Argumente voranstellt:

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

echo $@

Beispiel Verwendung:

$ ./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
quelle