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?

Jawaban:



19

Anda dapat menggunakan output pipa sebagai argumen skrip shell.

Coba metode ini:

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

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

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.



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

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.