最初の文字列が2番目の文字列で始まることを確認してください

最初の文字列が2番目の文字列で始まることを確認してください

JavaScriptにはこれを達成する機能があります。

'world'.startsWith('w')
true

シェルを使用してこれをどのようにテストできますか?私はこのコードを持っています:

if [ world = w ]
then
  echo true
else
  echo false
fi

しかし、平等をテストするので失敗します。私は組み込み機能を使用することを好みますが、このページのすべてのユーティリティを使用できます。

http://pubs.opengroup.org/onlinepubs/9699919799/idx/utilities.html

答え1

シェルがbashの場合:二重括弧内の==演算子の右側は、完全に引用されない限りパターンです。

if [[ world == w* ]]; then
    echo true
else
    echo false
fi

またはより簡潔に: [[ world == w* ]] && echo true || echo false[*]

bashを特別にターゲティングしない場合:パターンマッチングのためのケース説明の使用

case "world" in
    w*) echo true ;;
    *)  echo false ;;
esac

[*]しかし、フォームに注意する必要がありA && B || CますC誰でも失敗したまたはBは失敗しました。このif A; then B; else C; fiフォームはただAが失敗した場合はCを実行します。

答え2

$str変数を次の値に設定します(ここではに設定しますworld)。

str=world

それから:

if [ -n "${str%%w*}" ]
then
  echo false
else
  echo true
fi
  1. w*の始めからパターンを積極的に削除します$strw*一致wの後ろには任意の数の文字があるので、可能であれば文字列全体と一致します。
  2. 残りがある場合は$str開始しないでくださいw

または:

if [ "$str" = "${str#w}" ]
then
  echo false
else
  echo true
fi
  1. w可能であれば削除してください$str
  2. それと比較してみてください$str
  3. 同じ場合(つまり、削除は何もしません)$strから始めませんw

答え3

sh標準構文はcase次の構文です。

string=world
start=w
case $string in
  ("$start"*) printf '%s\n' "$string starts with $start";;
  (*)         printf '%s\n' "$string does not start with $start";;
esac

ワイルドカードが含まれている場合は引用符が$start必要です。$startたとえば、start='*'含めるかどうかに関係なく$start*常に一致します。[[ $string = "$start"* ]]ksh/bashも同様です。

関連情報