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?

Antworten:



19

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

Versuchen Sie diese Methode:

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

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

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.



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

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.