这是我的shell脚本,它接收来自stdin的用户输入的字符串。
#!bin/sh
printf "Enter your query\n"
read query
cmd=`echo $query | cut -f 1 -d " "`
input_file=`echo $query | cut -f 2 -d " "`
printf $input_file
if [ $input_file = "" ]
then
printf "No input file specified\n"
exit
fi
if [ $cmd = "summary" ]
then
awk -f summary.awk $input_file $query
fi
让我说他进入
summary a.txt /o foo.txt
现在cmd
变量的值为summary
而input_file
的值为a.txt
。
不是吗?
我希望summary.awk能够根据$input_file
中的内容在$query
上工作。
我的理解如下:
传递的第一个命令行参数被视为输入文件。
例如:awk 'code' file arg1 arg2 arg3
只有file
被视为输入文件
如果输入文件是管道输入,则它不会将任何参数视为输入文件。
例如:cat file | awk 'code' arg1 arg2 arg3
arg1
不被视为输入文件。
我是对的吗?
问题是
我得awk: cannot open summary (No such file or directory)
为什么要尝试打开summary
?
它是$input_file
之后的下一个单词。
如何解决此问题?
答案 0 :(得分:3)
如果没有-f
选项,则第一个非选项参数被视为脚本,其余参数是输入文件。如果有-f
选项,则脚本来自该文件,其余为输入文件。
当且仅当没有输入文件参数时,它才从stdin读取输入。这意味着如果你输入awk并给它文件名参数,它将忽略管道。
这与大多数Unix文件处理命令相同。
试试这个:
awk -f summary.awk -v query="$query" "$input_file"
这会将awk变量query
设置为查询内容。