私はシェルスクリプトを初めて使用します。以下の要件について教えてください。よろしくお願いします。
$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
$
まず、シェルでパラメーターに割り当てるときに使用しないことに注意してください。最初の行は次のとおりです。
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]}
では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
し、個々のフィールドを選択するために使用します。
少し不格好です。おそらくこれを達成するためのより良い方法があると確信していますがgrep
、cut
単独でかなり多くのことができるので、武器庫に持っておくと便利なツールです.
パラメータ展開と特別な 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]}
ところで、割り当てでは、左側の変数をドル記号で始めないでください。