Чи можна використовувати висновок труби як аргумент сценарію оболонки?


22

Припустимо, у мене є скрипт bash shell, Myscript.shякий потребує одного аргументу як вхідного.

Але я хочу, щоб вміст текстового файлу text.txtбув таким аргументом.

Я спробував це, але це не працює:

cat text.txt | ./Myscript.sh

Чи є спосіб це зробити?

Відповіді:



19

Ви можете використовувати висновок труби як аргумент сценарію оболонки.

Спробуйте цей метод:

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

2

Якщо у вас є декілька команд у файлі, розгляньте можливість використання xargs або паралелі , наприклад

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

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 з картографічним файлом, ви можете знову встановити позиційні параметри.

#!/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.