所有这些示例都使用内置函数,并且完全兼容dash。
查找子字符串
如果您实际上是在寻找字符串的子字符串,您可以使用case 或if。
让我通过使用每个函数编写两个不同的match 函数来进行说明。如果你很懒,你可以将这些函数中的任何一个剪切/粘贴到你的脚本中并使用:
if match -32 "$STRING"; then
echo "found '-32'!"
fi
例如如果您想在开头和结尾搜索$SUBSTR,并用空格与字符串的其余部分分隔,您可以使用以下内容:
function match() {
local SUBSTR="$1" STR="$2" # get args
case " $STR " in # add extra spaces
*" $SUBSTR "*) return 0 ;; # return true if match
esac
return 1 # no match: return false
}
(在上面的函数中,我在$STR 周围添加了空格,因此我不必在字符串的开头和结尾显式查找匹配项。)
function match() {
local SUBSTR=" $1 " STR=" $2 " # get args + add extra spaces
[ "${STR#*"$SUBSTR"}" != "$STR" ] \
&& return 0 # match: return true
return 1 # no match: return false
}
这个if 声明有点棘手。表达式${STR#*"$SUBSTR"} 部分意思是,取$STR,并从它的开头删除所有内容,直到第一次出现$SUBSTR(如果找不到$SUBSTR,不要删除任何内容)。然后我们将其与原始的$STR 进行比较,如果它们不同相同,我们就知道找到了子字符串。
寻找论据
现在,如果您实际上是在寻找一个参数,您可以使用上述任何一个函数,然后简单地使用match "-32" "$*",但会找到所有子字符串,并且不会将参数彼此区分开(例如在不太可能发生任何参数,例如文件名,碰巧包含匹配的字符串'-32'。
在这种情况下,最好只查看参数。我再给你写一个小函数,你可以用argmatch "$ARG" "$@"调用
argmatch() {
local FIND="$1" ARG; shift # get $FIND arg, remove it from $@
for ARG; do # loop $@
[ "$ARG" = "$FIND" ] && return 0 # found? then return true
done
return 1 # return false
}