文字列があります。
6.40.4
第二:
6.40
私はvar=$(echo $versionfull | cut -d'.' -f3)
bashの最初の文字列から3番目の数字を得ました。このコマンドは、2番目のコマンドに対して何を返しますか?空のように見えますが、[ -z $var ]
動作しません[ $var == "" ]
。0
2番目の文字列がある場合は値を指定したいと思います。
答え1
cut
奇妙なAPIがあります。
cut -f n
1行に1つ以上の区切り文字を含むn番目のフィールドを出力し(行にn-1区切り文字未満(nフィールド未満)がある場合は空)、行全体を返します。最初フィールド)区切り文字がない場合:
$ echo a.b.c | cut -d. -f3
c
$ echo a.b | cut -d. -f3
$ echo a | cut -d. -f3
a
だから答えは指定されたフィールドが存在しない場合、カットは何を返しますか?入力行にフィールドが 1 つ以上あるかどうかに応じて、最初のフィールドまたは空のフィールドです。
-s
オプションを追加できます。削除する区切り文字のない行は上記の奇妙な最後のケースを避けますが、一般的に望むものではありません(通常、入力行を完全にスキップするのではなく、空の3番目のフィールドを持つと見なしています)。最初のフィールドが必要な場合ははるかに悪いです。フィールド:
$ echo a | cut -sd. -f2
$ echo a | cut -sd. -f1
$
(最初のフィールドを要求すると、入力にフィールドは1つしかありませんが、入力に区切り文字がないため、出力は出ません。)
したがって、@ThoriumBRの追加の提案は.0
とても良いです。それなしで:
versionfull=5
echo "$versionfull" | cut -d. -f3
実際には5が出力されます。を追加すると、.0
入力に少なくとも1つの区切り文字があることが確認されます。私はさらに一歩進み、次のものを使います。
echo "$versionfull.0.0" | cut -d. -f3
入力に3つ以上のフィールドがあることを確認してください。各フィールドが切り捨てられるため、$versionfull
改行文字やバックスラッシュ文字自体が含まれていないとします。cut
ワイヤー\n
)の多くの実装は、入力を改行文字に変換しますecho
。
答え2
答え3
あなたが使用できるvar=$(echo "${versionfull}.0" | cut -d'.' -f3)
。
最初のケースではversionfull
6.40.4.0が含まれ、パディングは無視され、必要に応じて4が返されます。 2番目のケースでは、.0
埋められて返されます。
答え4
空の文字列に設定されます。コマンドで変数を使用するときは、変数を引用符で囲む必要があります[
。
if [ "$var" == "" ]
then echo "Var is empty"
fi
引用符がない場合、最初の行は次のように展開されます。
if [ == "" ]
==
これは左側に引数が必要なため、無効な構文です。