Pipe çıktısını kabuk komut dosyası bağımsız değişkeni olarak kullanabilir miyim?


22

Diyelim ki Myscript.shgirdi olarak bir argüman gerektiren bir bash kabuk betiği var .

Ama çağrılan metin dosyasının içeriğinin text.txtbu argüman olmasını istiyorum.

Bunu denedim ama işe yaramıyor:

cat text.txt | ./Myscript.sh

Bunu yapmanın bir yolu var mı?

Yanıtlar:



19

Boru çıkışını kabuk komut dosyası bağımsız değişkeni olarak kullanabilirsiniz.

Bu yöntemi deneyin:

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

2

Dosyada birden fazla komut varsa, xargs veya parallel komutunu kullanın , örn.

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

0

Deneyin,

 $ 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

böylece teker değerleriyle girebilirsiniz comli.shdan comli.txt.



0

Stdin'i mapfile ile okuyarak konumsal parametreleri yeniden ayarlayabilirsiniz.

#!/bin/bash

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

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

("$ @" Alıntı yapıldığında fordöngü satırları oluşturulur).

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

0

Soruyu doğru olarak cevaplayan tek IMHO olan @ bac0n'yi tamamlamak için, komut dosyası argümanları listenize borulu argümanların önüne geçecek bir kısa astar:

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

echo $@

Örnek kullanım:

$ ./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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.