Bourne Shellで文字列を比較するにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/183622

  •  06-07-2019
  •  | 
  •  

質問

シェル内の文字列を比較する必要があります:

var1="mtu eth0"

if [ "$var1" == "mtu *" ]
then
    # do something
fi

しかし、当然のことながら" *"シェルでは機能しません。それを行う方法はありますか?

役に立ちましたか?

解決

bash

最短の修正:

if [[ "$var1" = "mtu "* ]]

Bashの [[]] は、 [] (歴史的な理由から)とは異なり、グロブ展開されません。


bash --posix

ああ、投稿が速すぎた。 BashではなくBourneシェル...

if [ "${var1:0:4}" == "mtu " ]

$ {var1:0:4} は、 $ var1 の最初の4文字を意味します。


/ bin / sh

ああ、ごめんなさい。 BashのPOSIXエミュレーションは十分ではありません。真のオリジナルBourneシェルには $ {var1:0:4} がありません。 mstroblのソリューションのようなものが必要になります。

if [ "$(echo "$var1" | cut -c0-4)" == "mtu " ]

他のヒント

Unixツールを使用します。プログラム cut は、文字列を喜んで短縮します。

if [ "$(echo $var1 | cut -c 4)" = "mtu " ];

...必要な処理を行う必要があります。

expr を呼び出して、Bourne Shellスクリプト内の正規表現と文字列を照合できます。以下はうまくいくようです:

#!/bin/sh

var1="mtu eth0"

if [ "`expr \"$var1\" : \"mtu .*\"`" != "0" ];then
  echo "match"
fi

次のことを行います:

# Removes anything but first word from "var1"
if [ "${var1%% *}" = "mtu" ] ; then ... fi

または:

# Tries to remove the first word if it is "mtu", checks if we removed anything
if [ "${var1#mtu }" != "$var1" ] ; then ... fi

Bourneシェルで、文字列に別の文字列が含まれているかどうかを確認する場合:

if [  `echo ${String} | grep -c ${Substr} ` -eq 1 ] ; then

echo $ {String}を囲む| grep -c $ {Substr} と2つの `バックティック:

部分文字列が先頭または末尾にあるかどうかを確認するには:

if [ `echo ${String} | grep -c "^${Substr}"` -eq 1 ] ; then
...
if [ `echo ${String} | grep -c "${Substr}<*>quot;` -eq 1 ] ; then

caseステートメントを使用して文字列を比較したい。

簡単な例は

です
case "$input"
in
  "$variable1") echo "matched the first value" 
     ;;
  "$variable2") echo "matched the second value"
     ;;
  *[a-z]*)  echo "input has letters" 
     ;;
  '')       echo "input is null!"
     ;;
   *[0-9]*)  echo "matched numbers (but I don't have letters, otherwise the letter test would have been hit first!)"
     ;;
   *) echo "Some wacky stuff in the input!"
esac

次のようなおかしなことをしました

case "$(cat file)"
in
  "$(cat other_file)")  echo "file and other_file are the same"
      ;;
  *)  echo "file and other_file are different"
esac

これも機能しますが、ファイルが数メガバイトを超えることはできず、シェルは単にヌルを認識しないなど、いくつかの制限があります。他には何もありません)、このテストでは2つの間に違いは見られません。

ファイル比較を深刻な例として使用するのではなく、caseステートメントがtestまたはexprまたは他の同様のシェル式で使用できるよりもはるかに柔軟な文字列マッチングを実行できる方法の例のみです。

または、 =〜演算子の例として:

if [[ "$var1" =~ "mtu *" ]]
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top