Tôi có thể sử dụng đầu ra ống làm đối số kịch bản shell không?


22

Giả sử tôi có một tập lệnh shell bash được gọi là Myscript.shcần một đối số làm đầu vào.

Nhưng tôi muốn nội dung của tệp văn bản được gọi là text.txtđối số đó.

Tôi đã thử điều này nhưng nó không hoạt động:

cat text.txt | ./Myscript.sh

Có cách nào để làm việc này không?

Câu trả lời:



19

Bạn có thể sử dụng đầu ra ống làm đối số kịch bản shell.

Hãy thử phương pháp này:

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

2

Nếu bạn có nhiều lệnh trong tệp, hãy xem xét sử dụng xargs hoặc song song , ví dụ:

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

0

Thử,

 $ 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

vì vậy bạn có thể nhập các giá trị từng người một để comli.shtừ comli.txt.



0

Bằng cách đọc stdin với mapfile, bạn có thể đặt lại các tham số vị trí.

#!/bin/bash

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

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

(Trích dẫn "$ @" sẽ tạo forcác đường vòng thay thế).

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

0

Để hoàn thành @ bac0n mà IMHO là người duy nhất trả lời chính xác câu hỏi, đây là một đoạn ngắn sẽ bổ sung các đối số được dẫn vào danh sách đối số tập lệnh của bạn:

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

echo $@

Ví dụ sử dụng:

$ ./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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.