所以我有这个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
但我似乎得到了输出.txt 0,好像没有参数。我真的几乎不明白我什么时候使用 $1 $2 来处理参数,以及如何实际将参数发送到脚本中。
我应该使用管道吗?无论如何,它能被烟斗所暗示吗?
也。将文本文件传递到脚本时。$1 是文本文件的名称吗?echo $1
会打印file.txt
上面的例子,只完成指定的参数吗?
< ./file.txt
将命令行的标准输入设置为文件的内容。
read
需要用于读取标准输入。
也许这个脚本更接近您的需求
#/bin/bash --
printf "%dn" $#
调用它
./testScript.txt $(cat ./file.txt) > output.txt
$(...)
使外壳程序首先执行命令。然后将文件中的行作为参数传递给脚本
----
否则,如果您使用
./testScript.txt ./file.txt
那么$1
等于./file.txt
./testScript.txt < ./file.txt > output.txt
这里的testScript.txt没有参数,零,无,什么都没有。 shell 在命令运行之前解析文件重定向,< ./file.txt > output.txt
只是文件重定向,所以 shell 会"抓住"那部分——所以 test.txt Script 永远不知道哪些文件是从标准输入和标准输出重定向的。
这将起作用(即输出"5"):
./testScript.txt I am a proud sentence
这也是:
xargs ./testScript.txt < file.txt
。等等(见Jay Jargot的回答)。
欲了解更多信息,莫布德龙的这篇文章应该会有所帮助:命令行心理学 101