我有个问题。我正在编写一个脚本,该脚本将获得一些章程作为参数 $1 。我有文件“drinks.txt”,其中写了几行,如下所示:
Cocacola
juice
CocaPepsi
例如,我将作为参数“co”传递,这应该返回可口可乐和可口可乐。我的 IF 条件失败了。这是我的代码:
searchingParameter=$1
for drink in `cat drinks.txt`;do
if [ "$drink" == "$1*" ]; then
echo "$drink"
fi
done
因此,这应该打印出每一种含有 1 美元加 * 的饮料。为此执行 IF 的正确方法是什么?
提前致谢。
答案1
使用 shell 循环执行此操作很尴尬且容易出错。例如,如果您的drinks.txt
文件包含一个*
单独的行(或由空格包围),它将扩展到当前目录中的文件的名称。
相反,只需使用grep
:
grep -iF 'co' drinks.txt
在这里,我们使用grep
with-i
进行不区分大小写的匹配。该-F
选项意味着grep
应该使用该模式作为细绳而不是作为正则表达式(这在这里并不重要,但是会如果您的模式包含类似*
or.
或其他特殊正则表达式符号的字符,则很重要)。
该命令将返回包含字符串co
、Co
或cO
的每个完整行CO
。
作为脚本的一部分:
#!/bin/sh
grep -iF -e "$1" drinks.txt
我-e
在这里用的是“下一个参数是一个模式”。如果我不这样做并$1
以破折号开头,它将被视为 的一个选项grep
。
要在单词开头强制匹配,您可以使用
grep -i -e '\b'"$1" drinks.txt
或者
grep -i -e '\<'"$1" drinks.txt
其中\b
和\<
两者将在单词边界处匹配。请注意,我们必须删除-F
此处的选项,因为我们的模式现在是正则表达式。这也意味着 中的任何正则表达式字符都$1
将是特殊的。