利用可能なソフトウェアアップデートを通知するmacOS用のスクリプトを作成しようとしています。
result=$(softwareupdate -l)
if [[ $(echo $result) = *"No new software available."* ]]; then say yes;fi
しかし、重要な行は含まれていません。結果:
result=$(softwareupdate -l)
softwareupdate -l
++ softwareupdate -l
No new software available.
+ result='Software Update Tool
Finding available software'
if [[ $(echo $result) = *"No new software available."* ]]; then say yes;fi
echo $result
++ echo Software Update Tool Finding available software
+ [[ Software Update Tool Finding available software = *\N\o\ \n\e\w\ \s\o\f\t\w\a\r\e\ \a\v\a\i\l\a\b\l\e\.* ]]
「利用可能な新しいソフトウェアはありません」という行は変数に含まれません。なぜ?
答え1
出力がオンになっているのでSTDERR
、無効なファイル記述子出力。
どうしよう、結合してSTDOUT
そして STDERR
存在するbash
:
if softwareupdate -l 2>&1 | grep -q "No new software available"; then
echo "Nothing to do"
else
echo "Update available"
fi
ほとんどのコードを保持し、[[ ]]
文字列一致で使用するには、次のようにします。
result=$(softwareupdate -l 2>&1)
if [[ $result == *"No new software available"* ]]; then
[...]
代わりにbash 4.0以降を使用できます|&
。2>&1 |
macOSのデフォルトのbashはサポートするには古すぎるので、を使用するか、最新のbashをインストールする必要があり|&
ます(たとえば、Homebrewを使用)。2>&1 |
bash
brew install bash
このコードはブール論理:
grepコマンドまたは他のコマンドはtrueの場合は0を返し、falseの場合> 0を返すので、直接テストできます。
STDERR
:
これは、コマンドが端末に印刷する補助ファイル記述子です。デフォルトでは、解析してはいけないメッセージに対して機能します。標準エラーにリダイレクト:
>&2
STDIN
:
標準入力は、コマンドが入力を読み取ることができるファイル記述子です。
STDOUT
これは、コマンドが端末に印刷するデフォルトのファイル記述子です。