から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に通知します。ピリオドが見つかり、その後に何かが続く可能性がある場合は、何も置き換えないでください。

コメント

  • この回答を詳しく説明してもらえますか。 s/の部分の意味は理解できますが、\..*はどうですか?
  • @DanijelJ説明を追加しました。あなたがすでに知っていることと重複しますが、あなたがしなかったものを除外するよりもそれが良いと思いました'。それが役立つかどうか教えてください。
  • はい、それは私に多くのことを説明します。私は\.を理解しました' 2番目の。これを明確にしていただきありがとうございます。

回答

ここでは、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 

もちろん、これを拡張して、より多くのバージョンを認識できます。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です