Предположим, у меня есть скрипт оболочки bash с именем, Myscript.sh
которому требуется один аргумент в качестве входных данных.
text.txt
Но я хочу , чтобы в качестве аргумента использовалось содержимое текстового файла .
Я попробовал это, но это не работает:
cat text.txt | ./Myscript.sh
Есть ли способ сделать это?
решение1
./Myscript.sh "$(cat text.txt)"
решение2
Вы можете использовать вывод конвейера в качестве аргумента скрипта оболочки.
Попробуйте этот метод:
cat text.txt | xargs -I {} ./Myscript.sh {}
решение3
Чтобы завершить @bac0n, который, по моему скромному мнению, единственный, кто правильно ответил на этот вопрос, вот короткая строка, которая добавит переданные по конвейеру аргументы в начало списка аргументов вашего скрипта:
#!/bin/bash
declare -a A=("$@")
[[ -p /dev/stdin ]] && { \
mapfile -t -O ${#A[@]} A; set -- "${A[@]}"; \
}
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
решение4
Если у вас в файле имеется более одного набора аргументов (для множественных вызовов), рассмотрите возможность использованияxargsилипараллельный, например
xargs -d '\n' Myscript.sh < text.txt
parallel -j4 Myscript.sh < text.txt