Можно ли использовать вывод канала в качестве аргумента сценария оболочки?


22

Предположим, у меня есть скрипт оболочки bash, Myscript.shкоторый требует ввода одного аргумента.

Но я хочу, чтобы содержание текстового файла вызывало text.txtэтот аргумент.

Я пробовал это, но это не работает:

cat text.txt | ./Myscript.sh

Есть ли способ сделать это?

Ответы:



19

Вы можете использовать вывод канала в качестве аргумента сценария оболочки.

Попробуйте этот метод:

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


0

Пытаться,

 $ 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

так что вы можете ввести значения по одному на comli.shиз comli.txt.



0

Читая stdin с mapfile, вы можете переустановить позиционные параметры.

#!/bin/bash

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

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

(При цитировании «$ @» forвместо этого получаются строки цикла).

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

0

Чтобы завершить @ bac0n, который IMHO является единственным, кто правильно ответит на вопрос, вот короткая строка, которая добавит переданные по конвейеру аргументы к вашему списку аргументов скрипта:

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

echo $@

Пример использования:

$ ./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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.