从 shell 脚本中由一行组成的文件中读取参数



所以我有这个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

相关内容

  • 没有找到相关文章

最新更新