我有一个像
这样的命令cat file | sh myscript.sh
如何将cat file
的输出读入myscript.sh?
答案 0 :(得分:3)
cat file | while read something; do echo "This is $something" ; done
详细信息取决于数据的性质和您的意图。
既然你已经说过要将整个文件放在一个变量中,那就是
var="$(cat file)"
答案 1 :(得分:0)
您是否可以使用cat
,只需将文件传递给您的脚本:
myscript.sh file
答案 2 :(得分:0)
我用的是:
#!/bin/sh
cat "$@" | <my commands>
这样,如果一个或多个文件名作为参数给出,它们将被传递给&lt; my commands&gt;。如果没有给出文件,cat
将检索标准输入并将其传递给&lt; my commands&gt;。
答案 3 :(得分:0)
仅当您的输入不包含任何NUL
(\0
)字符时才有效 - 变量不能包含NUL
,因为它用于设置变量的结尾。
read -r -d ''
现在您可以使用$REPLY
变量,该变量将包含文件的所有内容。
答案 4 :(得分:0)
如果你必须使用这个 - cat file | sh myscript.sh
- 将文件管道到另一个shell脚本的方向,请使用xargs:
内容file.txt
:
blah1
blah2
blah3
内容myscript.sh
:
#!/bin/bash
echo $1
使用xargs
来实现以下任一目标:
变化0:
user@host:~$ cat file.txt | xargs -E ./myscript.sh
blah1 blah2 blah3
-E eof-str
Set the end of file string to eof-str. If the end of
file string occurs as a line of input, the rest of
the input is ignored. If neither -E nor -e is used,
no end of file string is used.
变体1:
user@host:~$ cat file.txt | xargs ./myscript.sh
blah1
变体2:
user@host:~$ cat file.txt | xargs --null ./myscript.sh
blah1 blah2 blah3
变体3:
user@host:~$ cat file.txt | xargs -I{} ./myscript.sh {}
blah1
blah2
blah3
请注意,-I
受限于每行的最大字符数限制。可以通过指定--max-chars
或-s
来设置此限制:
user@host:~$ cat file.txt | xargs -I{} -s 100000 ./myscript.sh {}
blah1
blah2
blah3
答案 5 :(得分:0)
似乎很多当前的答案都鼓励OP在脚本中读取文件,而不是回答问题。如果您正在调用命令:
$ cat file | sh myscript.sh
并且您希望文件的内容在变量中,然后您只需要让脚本将stdin读入变量。最简单的方法是使用cat:
#!/bin/sh v=$(cat)
请注意,原始命令是UUOC,可以通过以下方式完成:
$ < file sh myscript.sh
或
$ sh myscript.sh < file
另请注意,将stdin读入变量v将读取直到stdin关闭,因此如果直接调用myscript.sh(即,使用tdin上的stdin),它将阻塞,直到用户点击^ d(或者其他键序列表示平台上的EOF。)将文件名作为参数传递给脚本确实是一个更好的主意。