所有这些示例都只使用内置函数,并且完全兼容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')。
在这种情况下,最好只查看 args。我会再为你写一个你可以调用的小函数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
}