从shell脚本中包含一行的文件中读取参数

时间:2016-05-21 13:55:15

标签: bash shell unix

所以我有这个shell脚本:

#!/bin/bash -xv

PATH=${PATH[*]}:.
#filename: testScript

echo $#

它应该打印我从文本文件中收到的参数数量 我有一个文本文件(名为:file.txt),其中包含一行:

I am a proud sentence

根据我的理解,输出应该是5.由于有5个单词,因此有5个参数 我尝试通过以下方式运行它:

chmod +x ./testScript.txt

./testScript.txt < ./file.txt > output.txt

但我似乎进入output.txt 0,好像没有参数。我真的几乎不明白何时使用$ 1 $ 2来处理参数,以及如何将参数实际发送到脚本中。
我应该使用管道吗?无论如何,它可以用管道实现吗?

另外。将文本文件传递给脚本时。 1美元是文本文件的名称吗?对于上面的示例,echo $1是否会打印file.txt,只完成指定的参数?

2 个答案:

答案 0 :(得分:0)

< ./file.txt将命令行的标准输入设置为文件内容。

需要使用

read来读取标准输入。

也许这个脚本更贴近您的需求

#/bin/bash --
printf "%d\n" $#

调用它
./testScript.txt $(cat ./file.txt) > output.txt

$(...)使shell先执行命令。然后将文件中的行作为参数传递给脚本

----

否则,如果您使用

 ./testScript.txt ./file.txt

然后$1等于./file.txt

答案 1 :(得分:0)

 ./testScript.txt < ./file.txt > output.txt

此处 testScript.txt 具有参数,零,无,。 shell在命令运行之前解析文件重定向,而< ./file.txt > output.txt只是文件重定向,所以shell&#34;抓取&#34;该部分 - 所以 testScript.txt 永远不会知道从标准输入和标准输出重定向哪些文件。

这样可行(即输出&#34; 5&#34;):

./testScript.txt I am a proud sentence

那就是这样:

xargs ./testScript.txt < file.txt

......等等(见Jay Jargot的答案)。

有关详细信息,Mo Budlong撰写的这篇文章应该会有所帮助:Command line psychology 101

相关问题