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


22

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

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

我已经尝试过了,但是没有用:

cat text.txt | ./Myscript.sh

有没有办法做到这一点?

Answers:



19

您可以将管道输出用作Shell脚本参数。

试试这个方法:

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

2

如果文件中有多个命令,请考虑使用xargsparallel,例如

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.shcomli.txt



0

通过使用mapfile读取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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.