Bisakah saya menggunakan output pipa sebagai argumen skrip shell?

22

Misalkan saya memiliki skrip bash shell bernama Myscript.shyang membutuhkan satu argumen sebagai input.

Tapi saya ingin konten file teks dipanggil text.txtmenjadi argumen itu.

Saya sudah mencoba ini tetapi tidak berhasil:

cat text.txt | ./Myscript.sh

Apakah ada cara untuk melakukan ini?

Narin
sumber

Jawaban:

19

Anda dapat menggunakan output pipa sebagai argumen skrip shell.

Coba metode ini:

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

Jika Anda memiliki lebih dari satu perintah dalam file, pertimbangkan untuk menggunakan xargs atau paralel , mis

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

Mencoba,

 $ 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

sehingga Anda dapat memasukkan nilai satu per satu comli.shdari comli.txt.

Ranjithkumar T
sumber
0

Dengan membaca stdin dengan mapfile Anda dapat mengatur ulang parameter posisi.

#!/bin/bash

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

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

(Mengutip "$ @" forsebagai gantinya akan membuat garis loop).

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

Untuk menyelesaikan @ bac0n dimana IMHO adalah satu-satunya yang menjawab pertanyaan dengan benar, berikut ini adalah short-liner yang akan menambahkan argumen yang disalurkan ke daftar argumen skrip Anda:

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

echo $@

Contoh penggunaan:

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