我可以使用管道输出作为 shell 脚本参数吗?

我可以使用管道输出作为 shell 脚本参数吗?

假设我有一个名为的 bash shell 脚本Myscript.sh,需要一个参数作为输入。

但我希望调用的文本文件的内容text.txt就是该参数。

我尝试过这个但是没有用:

cat text.txt | ./Myscript.sh

有没有办法做到这一点?

答案1

命令替换

./Myscript.sh "$(cat text.txt)"

答案2

您可以使用管道输出作为 shell 脚本参数。

尝试这个方法:

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 -d '\n' Myscript.sh < text.txt
parallel -j4 Myscript.sh < text.txt

相关内容