我想检测输入参数是否包含某些子字符串。
我尝试了以下脚本:
#1:
#!/bin/sh
if [ $1 = *abc* ]
then
echo contains abc
else
echo not contains abc
fi
#2:
if [ "$1" = "*abc*" ]
then
echo contains abc
else
echo not contains abc
fi
#3:
if [ "$1" = *"abc"* ]
then
echo contains abc
else
echo not contains abc
fi
#1 ~ #3 都不起作用。
但下面的[[
可以轻松工作:
#4:
if [[ $1 = *"abc"* ]]
then
echo contains abc
else
echo not contains abc
fi
#5:
if [[ $1 = *abc* ]]
then
echo contains abc
else
echo not contains abc
fi
那么单曲可以制作吗[
?
添加 1 - 2021 年 9 月 21 日上午 10:55
刚刚发现一个非常有用的线程:
答案1
[[
是一个内置的 shell。它是 的一个更通用的版本[
,它是一个可执行文件/usr/bin
(请参阅文档和man
页面test
了解更多详情)。
[
更便携,同时[[
更通用,通常是您应该使用的变体。
if [[ $1 == *"abc"* ]]; then
echo "substring present"
else
echo "substring not present"
fi
测试子字符串的另一个好方法是使用正则表达式运算符:
if [[ "$1" =~ .*"abc".* ]]; then
echo "contains"
else
echo "doesn't contain"
fi
注意后面的表达式=~
是正则表达式而不仅仅是通配符。
检查子字符串的另一种方法是使用case
:
case $1 in
*"abs"*)
echo "substring present"
;;
*)
echo "substring not present"
;;
esac
或者,您可以使用grep
,正如 CPH 在他的帖子中解释的那样。但是您需要确保使用这里-文档:
if grep -q "abc" <<< "$STR"; then
echo "substring present"
else
echo "substring not present"
fi
答案2
您想使用单括号有什么原因吗?
一个更简单的方法是这样的:
if echo "$1" | grep 'abc' > /dev/null; then
# Do if true substring found
else
# substring not found
fi
如果您不熟悉该grep
命令,它只是在字符串中搜索您给出的参数/值。如果您想使用该标志,您可以忽略大小写-i
,上面将专门查找参数“$1”中的小写“abc”