シェルで文字列を比較する必要があります:
var1="mtu eth0"
if [ "$var1" == "mtu *" ]
then
# do something
fi
しかし、明らかに「*」はシェルでは機能しません。それを行う方法はありますか?
Unix ツールを使用します。プログラムcut
は喜んで文字列を短くします。
if [ "$(echo $var1 | cut -c 4)" = "mtu " ];
... あなたがやりたいことをすべきです。
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 " ]
expr
Bourne Shell スクリプト内から正規表現に対して文字列を照合するために呼び出すことができます。以下はうまくいくようです:
#!/bin/sh
var1="mtu eth0"
if [ "`expr \"$var1\" : \"mtu .*\"`" != "0" ];then
echo "match"
fi
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、またはその他の同様のシェル式で使用できるよりもはるかに柔軟な文字列照合を行うことができる方法の例にすぎません。
私は次のことをします:
# 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}$"` -eq 1 ] ; then
または、=~演算子の例として:
if [[ "$var1" =~ "mtu *" ]]