指定されたフィールドが存在しない場合、カットは何を返しますか?

指定されたフィールドが存在しない場合、カットは何を返しますか?

文字列があります。

6.40.4

第二:

6.40

私はvar=$(echo $versionfull | cut -d'.' -f3)bashの最初の文字列から3番目の数字を得ました。このコマンドは、2番目のコマンドに対して何を返しますか?空のように見えますが、[ -z $var ]動作しません[ $var == "" ]02番目の文字列がある場合は値を指定したいと思います。

答え1

cut奇妙なAPIがあります。

cut -f n1行に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

直接の質問に答えるためcutに末尾の改行以外は何も返されません。仕様によると(ありがとうございます。ドンクリスティ参考用):

echo "$versionfull" | cut -d. -f3 | od -c
0000000  \n
0000001

ここで文字列をサポートするシェルがある場合は、次のことができます。

IFS=. read a b c <<< "$versionfull"

$versionfullスペースがある場合に備えて参照を参照してください(のすべての項目$IFS)。

c値が空であると思われる場合は、0に設定するように依頼してください。

c=${c:-0}

答え3

あなたが使用できるvar=$(echo "${versionfull}.0" | cut -d'.' -f3)

最初のケースではversionfull6.40.4.0が含まれ、パディングは無視され、必要に応じて4が返されます。 2番目のケースでは、.0埋められて返されます。

答え4

空の文字列に設定されます。コマンドで変数を使用するときは、変数を引用符で囲む必要があります[

if [ "$var" == "" ]
then echo "Var is empty"
fi

引用符がない場合、最初の行は次のように展開されます。

if [ == "" ]

==これは左側に引数が必要なため、無効な構文です。

関連情報