2

この質問にはすでに回答済みの有力な候補がいくつかあり、私はこの問題を解決するためにいくつかの方法を試しました。具体的には、私のシナリオは次のとおりです。

Linuxマシンにインストールされている可能性がある、またはインストールされていない可能性のあるユーティリティ名の配列(例:ssh、sudoなど)があるため、呼び出しを試みた結果に基づいてユーティリティが存在するかどうかを確認しようとしています次にユーティリティ。私はbashでこれをやろうとしています。Bash のバージョンは 4.1.5(1) で、Ubuntu 10.10 で実行されていますが、BusyBox に展開する予定です。

ユーティリティが存在しない場合は、通常、「見つかりません」というメッセージが表示されるか、正確な文字列が含まれています。それ以外の場合は、使用法に関するメッセージが表示されます。使用する grep に対していくつかの正規表現を試しましたが、何の違いもありませんでした。そのため、私のコードにはもっと根本的な欠陥があると思われます。

これを行うユーティリティがあることは十分に認識していますが、私が作業している環境では、ユーティリティ/パッケージをチェックするための dpkg などにアクセスできません。要するに、これを展開する予定の環境にはパッケージ管理がありません。

私が持っているものは大まかに次のようになります:

#!/bin/bash
TOOLS=( 'ssh' 'soodo' 'dhclient' 'iperf')
#list of tools is abridged for convenience and added 'soodo' as a sure miss

#add a ridiculous option flag so don't accidentally trip any real flags
if `echo ${TOOLS[0]} -222222 | grep -q "not found"`; then
echo "${TOOLS[0]} is not installed."
else echo `${TOOLS[0]} --version`

#I am aware that --version is not applicable for all utilities, but this is just
#for sake of example.

私の問題は、 if never が正確にピックアップされているように見えないことです。`マークをいじると、ifで偽陽性または偽陰性が作成されます(たとえば、soodoのようなプログラムは存在しないのに存在すると主張され、sshのようなものはインストールされていてもインストールされていないと報告されます) .

私がやろうとしていることなどについてさらに説明が必要な場合は、お尋ねください。それは、他の人からの洞察と引き換えに私が提供できる最低限のものです.

4

2 に答える 2

1
#!/bin/bash
TOOLS=( 'ssh' 'soodo' 'dhclient' 'iperf')
#list of tools is abridged for convenience and added 'soodo' as a sure miss

for TOOL in ${TOOLS[@]}
do
  which $TOOL > /dev/null
  RESULT=$?
  if [ $RESULT -eq 0 ]
  then
    echo $TOOL is available
  else
    echo $TOOL is not available
  fi
done
于 2011-07-19T18:25:45.450 に答える
1

bashtypeの場合、コマンドが PATH 内のプログラムであるか、関数またはエイリアスであるかを判断する方法です。

TOOLS=( 'ssh' 'soodo' 'dhclient' 'iperf')
for tool in "${TOOLS[@]}"; do
  if type -p "$tool" > /dev/null; then
    echo "$tool is installed"
  else
    echo "$tool is not installed"
  fi
done

あなたがやっていることのエラー:

if `echo ${TOOLS[0]} -222222 | grep -q "not found"`; then

そこで何が起こっているのですか:

  • 最初に、echo ${TOOLS[@]} -222222「ssh -222222」を標準出力に出力します
  • grep -q "not found"stdout に何も出力しないパイプ
  • バッククォートは、パイプラインからの出力 (常に からの出力である空白行grep -q) をifコマンドに代入するため、次のようになります。if <a newline> ; then

if $(printf "\n"); then echo Y; else echo N; fi常に true と同じ結果が得られます。

あなたが試みていることを行うには、次のように書く必要があります:

if "${TOOLS[0]}" -222222 2>&1 | grep -q "not found"; then ...

これにより、パイプラインが実行ifされ、終了ステータスが考慮されます。終了ステータス 0 は true と見なされ、その他の終了ステータスは false と見なされます。

ただし、プログラムが存在するかどうかを調べるためにこれを行わないでください。

于 2011-07-19T18:23:20.327 に答える