16

私はシェルスクリプトを初めて使用します。以下の要件について教えてください。よろしくお願いします。

$AU_NAME=AU_MSM3-3.7-00.01.02.03
#separate the string after last "-", with "." as delimiter
#that is, separate "00.01.02.03" and print/save as below.
major=00
minor=01
micro=02
build=03
4

3 に答える 3

25

$まず、シェルでパラメーターに割り当てるときに使用しないことに注意してください。最初の行は次のとおりです。

AU_NAME=AU_MSM3-3.7-00.01.02.03

$、割り当てられたパラメータの値を取得するために使用されます。の後のビットは$、名前だけでなく余分なものを含む中括弧で囲まれた式にすることができ、値に対してさまざまな操作を実行できます。たとえば、次のようなことができます。

IFS=. read major minor micro build <<EOF
${AU_NAME##*-}
EOF

ここで##*-、文字列の先頭から最後の「-」まですべてを取り除き、「00.01.02.03」だけを残します。IFS (Internal Field Separator) パラメータは、文字列をフィールドに分割する場所をシェルに指示します。

bash、zsh、および ksh93+ では、ヒアドキュメントをヒア文字列に短縮することで、1 行にまとめることができます。

IFS=. read major minor micro build <<<"${AU_NAME##*-}"

より一般的には、これらの同じシェルでは、個別の変数ではなく、任意のサイズの配列に分割できます。

IFS=. components=(${AU_NAME##*-})

(ただし、その構文は特に古いバージョンの ksh では機能しません。それらの場合は、代わりに次のようにする必要があります。

IFS=. set -A components ${AU_NAME##*-}

)

これにより、この等価性が得られます (zsh を除き、デフォルトでは、0 から 3 ではなく 1 から 4 の要素に番号が付けられます)。

major=${components[0]}
minor=${components[1]}
micro=${components[2]}
build=${components[3]}
于 2013-11-11T21:05:22.437 に答える
15

ではbash、次のようなことができます。

version=$(echo $AU_NAME | grep -o '[^-]*$')
major=$(echo $version | cut -d. -f1)
minor=$(echo $version | cut -d. -f2)
micro=$(echo $version | cut -d. -f3)
build=$(echo $version | cut -d. -f4)

grep呼び出しは、行の-o一致する部分のみを出力する which を使用します。一致自体は、行末までのすべての非ハイフン文字です。

cutコマンドは区切り文字( .)-d.を使用-fし、個々のフィールドを選択するために使用します。

少し不格好です。おそらくこれを達成するためのより良い方法があると確信していますがgrepcut単独でかなり多くのことができるので、武器庫に持っておくと便利なツールです.

于 2013-11-11T20:45:50.820 に答える
3

パラメータ展開と特別な IFS 変数を使用できます。

#! /bin/bash
AU_NAME=AU_MSM3-3.7-00.01.02.03
IFS=. VER=(${AU_NAME##*-})
for i in {0..3} ; do
    echo ${VER[i]}
done

major=${VER[0]}
minor=${VER[1]}
micro=${VER[2]}
build=${VER[3]}

ところで、割り当てでは、左側の変数をドル記号で始めないでください。

于 2013-11-11T21:04:52.177 に答える