Linux Shell脚本 - 使用通配符进行字符串比较
Linux Shell脚本 - 使用通配符进行字符串比较
我正在尝试在Shell脚本(#!bin/sh)中判断一个字符串是否是另一个字符串的一部分。
我现在的代码是:
#!/bin/sh #用于测试字符串比较的测试脚本! testFoo () { t1=$1 t2=$2 echo "t1: $t1 t2: $t2" if [ $t1 == "*$t2*" ]; then echo "$t1 和 $t2 相等" fi } testFoo "bla1" "bla"
我想要的结果是,当"bla"存在于"bla1"中时,我想知道它的存在。
谢谢和问候,
更新:
我尝试了在How do you tell if a string contains another string in Unix shell scripting?中描述的"contains"函数,以及String contains in bash中的语法。
然而,它们似乎与正常的Shell脚本(bin/sh)不兼容...
有办法解决吗?
Linux Shell脚本-使用通配符进行字符串比较
在bash中使用==
或!=
进行字符串比较时,可以这样写:
if [[ $t1 == *"$t2"* ]]; then
echo "$t1 and $t2 are equal"
fi
注意星号放在引号的外部,并且通配符模式必须在右侧。
对于/bin/sh,=
操作符仅用于相等性,而不是模式匹配。但可以使用case
进行模式匹配:
case "$t1" in
*"$t2"*) echo t1 contains t2 ;;
*) echo t1 does not contain t2 ;;
esac
如果你特别针对Linux,我会假设存在/bin/bash。
非常感谢Glenn!非常感谢!(并且这是一个Linux环境,但非常轻量级,没有/bin/bash,所以我真的需要/bin/sh版本!- 再次感谢!)
比起使用case,使用=~操作符更好:if [[ $t1 =~ %t2* ]]; the echo match; fi,
对于正则表达式,你需要[[ $t1 =~ "$t2" ]]
。
对,除了一个拼写错误(%t2而不是$t2),sh实际上可能不支持双括号[[ ]]。
哦,这真是太令人费解了!谢谢,现在我明白了。
关于bash,没有太多的直观。
谢谢,我只是在学习,并且我犯了与这个问题的作者完全相同的错误,例如在引号之间放置通配符。
jackman,嘿伙计,你能帮我完成我的脚本吗?我在获取*856*
时遇到了麻烦,因为*
是一个通配符。这是我的脚本:findFile() { while read -r LINE; do printf "$LINE\n"; grep -il '$LINE' *856*; done < /path/to/file.txt }
注意,顺序很重要:通配符需要在比较的右侧...至少根据我的经验如此。