からDebianリリース番号を見つけるためのBashスクリプト以下は、Debianのバージョンをテストするために現在使用しているものです。このようにして、もっと簡潔にすることはできますか?
#!/bin/bash VERSION=NONE if [ $(cat /etc/debian_version) == "7.3" ]; then VERSION=7 elif [ $(cat /etc/debian_version) == "7.2" ]; then VERSION=7 elif [ $(cat /etc/debian_version) == "7.1" ]; then VERSION=7 elif [ $(cat /etc/debian_version) == "7.0" ]; then VERSION=7 fi
これを行うのに最も魅力的な方法ではないことはわかっています。私が欲しいのは、/etc/debian_version
のファイルを使用して.
の前のバージョン番号を読み取り、後の番号を無視する方法を理解することです。
使用してみました
if [ $(cat /etc/debian_version) == "7.*" ]; then
また試しました
if [ $(cat /etc/debian_version) == "7.2|7.1|7.0" ]; then
しかし、これらはどちらも私にはうまくいきませんでした。 Debian 7.4がリリースされた場合に、これに依存するすべてのスクリプトに戻って変更する必要がないように、スクリプトを将来的に証明したいと思います。
相対情報を表示していますが、そこから必要なものを「切り取り」、Debian6または7であることを確認する方法がわかりません。ご想像のとおり、元のスクリプトです。 、はかなり長いです。
私に指摘できる他の投稿は、応答を「切り取って」、必要な部分だけを切り取る方法を使用していただければ幸いです。
回答
やりたいことを行う方法はたくさんあります。これは、バージョン番号から小数点とそれ以降のすべてを削除するだけです。
VERSION=$(sed "s/\..*//" /etc/debian_version)
\..*
はピリオドを意味します( \.
)の後に0個以上の任意の文字(.*
)が続きます。したがって、sed
の場合、式s/\..*//
は、ピリオドとそれに続くすべてを何も置き換えないことを意味します。 sed
コマンドの結果は環境変数VERSION
に保存されます。
上記により、 if / then / elif /…/fiステートメント。 bashと通常の/ bin / shの両方で機能します。
詳細: sed
はストリームエディターです。つまり、stdinから行を読み取り、指示に従って編集し、(通常は)stdoutに送信します。この場合、「代替」命令を出します。たとえば、s/foo/bar/
は、fooの最初の出現を見つけて、それをbarに置き換えることを意味します。特別な場合として、s/foo//
は、foo
を何も置き換えないことを意味します。この場合、ピリオドの後に任意の文字を何も付けずに置き換えます。さて、ピリオドは「。」です。ただし、sed
は通常、ピリオドを「任意の文字」を意味するものとして扱います。したがって、その前に円記号を付けて「エスケープ」する必要があります。 sed
が\.
を見ると、文字通りのピリオドを意味していることがわかります。また、ピリオドに続く文字もすべて消去したいと思います。 「任意の文字」を表すために、ピリオド.
を使用します(エスケープなし)。ただし、一般的には、ピリオドの数に関係なく、ピリオドに続くすべての文字を削除します。したがって、sed
の言語では、ピリオドは任意の文字を意味し、スターは「前の文字の任意の数」(ゼロの場合もあります)を意味します。したがって、period-star .*
は、0個以上の文字を意味します。したがって、すべてをまとめると、s/\..*//
はsed
に通知します。ピリオドが見つかり、その後に何かが続く可能性がある場合は、何も置き換えないでください。
コメント
回答
ここでは、bashを使用し、外部ユーティリティを使用しないソリューションです。 、および単一の呼び出しです
read -d . VERSION < /etc/debian_version
これは/etc/debian_version
を読み取り、期間の入力を分割します(.
)、ピリオドの前のすべてをVERSION
に割り当て、後のすべてを破棄します。
IFS="." read VERSION VERSION_MINOR < /etc/debian_version
これは、VERSION_MINORの期間の後にすべてを保存するという点で少し異なります
IFS="." read -a VERSION < /etc/debian_version
これはその中で最も強力ですピリオドで分割され、配列$VERSION
に割り当てられます。バージョンが1.2.3
の場合、${VERSION[0]} == 1
${VERSION[1]} == 2
および${VERSION[2]} == 3
。
コメント
- これは素晴らしいです!'このように読み取りが使用されているのを見たことがありません!
回答
case `cat /etc/debian_version` in 7*) VERSION=7;; *) VERSION=NONE;; esac
もちろん、これを拡張して、より多くのバージョンを認識できます。
s/
の部分の意味は理解できますが、\..*
はどうですか?\.
を理解しました' 2番目の。これを明確にしていただきありがとうございます。