所以我有这个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
,只完成指定的参数?
答案 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