1. ホーム
  2. shell

[解決済み] POSIX shで文字列が他の文字列を含んでいるかどうかを判断するにはどうすればよいですか?

2022-04-27 20:21:09

質問

Unixのシェルスクリプトで、ある文字列の中に別の文字列があった場合に様々なロジックを実行するものを書きたいのですが、どうすればいいですか?例えば、あるフォルダの中にいたら、分岐させるとか。どなたか、これを実現する方法を教えていただけませんか?できればシェルにこだわらない(つまりbash限定ではない)ものにしたいのですが、他に方法がないのであればそれで何とかします。

#!/usr/bin/env sh

if [ "$PWD" contains "String1" ]
then
    echo "String1 present"
elif [ "$PWD" contains "String2" ]
then
    echo "String2 present"
else
    echo "Else"
fi

解決方法は?

さらに別の解決策を紹介します。これは POSIX部分文字列パラメータ展開 そのため、Bash、Dash、KornShell(ksh)、Zシェル(zsh)などで動作します。

test "${string#*$word}" != "$string" && echo "$word found in $string"

いくつかの例を含む機能化されたバージョン。

# contains(string, substring)
#
# Returns 0 if the specified string contains the specified substring,
# otherwise returns 1.
contains() {
    string="$1"
    substring="$2"
    if test "${string#*$substring}" != "$string"
    then
        return 0    # $substring is in $string
    else
        return 1    # $substring is not in $string
    fi
}

contains "abcd" "e" || echo "abcd does not contain e"
contains "abcd" "ab" && echo "abcd contains ab"
contains "abcd" "bc" && echo "abcd contains bc"
contains "abcd" "cd" && echo "abcd contains cd"
contains "abcd" "abcd" && echo "abcd contains abcd"
contains "" "" && echo "empty string contains empty string"
contains "a" "" && echo "a contains empty string"
contains "" "a" || echo "empty string does not contain a"
contains "abcd efgh" "cd ef" && echo "abcd efgh contains cd ef"
contains "abcd efgh" " " && echo "abcd efgh contains a space"