15

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

var1="mtu eth0"

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

しかし、明らかに「*」はシェルでは機能しません。それを行う方法はありますか?

4

7 に答える 7

19

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

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

... あなたがやりたいことをすべきです。

于 2008-10-08T16:28:27.347 に答える
9

bash

最短の修正:

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

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


bash --posix

ああ、投稿が速すぎました。Bashではなくボーンシェル...

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

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


/bin/sh

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

if [ "$(echo "$var1" | cut -c0-4)" == "mtu " ]
于 2008-10-08T16:27:34.527 に答える
6

exprBourne Shell スクリプト内から正規表現に対して文字列を照合するために呼び出すことができます。以下はうまくいくようです:

#!/bin/sh

var1="mtu eth0"

if [ "`expr \"$var1\" : \"mtu .*\"`" != "0" ];then
  echo "match"
fi
于 2008-10-08T16:37:45.473 に答える
3

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、またはその他の同様のシェル式で使用できるよりもはるかに柔軟な文字列照合を行うことができる方法の例にすぎません。

于 2009-11-02T18:58:52.467 に答える
2

私は次のことをします:

# 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
于 2008-10-08T21:13:02.217 に答える
1

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}$"` -eq 1 ] ; then
于 2010-02-08T23:58:11.360 に答える
-1

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

if [[ "$var1" =~ "mtu *" ]]
于 2008-10-08T16:29:14.740 に答える