bashスクリプトのwhileループ出力

bashスクリプトのwhileループ出力

内容を含むファイルがありますips

192.168.10.10 3306
192.168.10.20 3306

私のスクリプトは次のとおりです

1 #!/bin/bash
  2
  3 p=0
  4 cat /root/ips | while read host port
  5  do
  6    check_up=$(bash -c 'exec 3<> /dev/tcp/'$host'/'$port';echo $?' 2>/dev/null)
  7     if [ $check_up != 0 ]
  8         then
  9           p=$[$p+1]
 10           echo "(1):p in loop = $p"
 11     fi
 12         echo "(2):p in loop = $p"
 13  done
 14      echo "(3):p out loop = $p"
 15
 16     if [ $p % 2 != 0 ]
 17        then
 18             exit 1
 19      fi
~

出力は次のとおりです

[root@db1 ~]# ./new-script.sh
(1):p in loop = 1
(2):p in loop = 1
(1):p in loop = 2
(2):p in loop = 2
(3):p out loop = 0
./new-script.sh: line 16: [: too many arguments

echo "(3):p out loop = $p"戻り理由0(最初の値$p)! ?最後の値は$pいつでしたか2?また、16行目のエラーをどのように修正できますか?

答え1

シェルで算術演算を実行する標準的な方法はです$((..))。標準test/[比較およびその他のテストのみをサポートします。したがって、標準互換バージョンは次のようになります。

if [ "$(( p % 2 ))" -ne 0 ]; then...

(引用符は数字が含まれている場合にのみ必要であるため、IFS通常は必要ありません。)


(( .. ))Bash / ksh / zshでは、コマンドのように機能し、テストも可能な次の設定を使用できます。

if (( p % 2 != 0 )); then ...

この[[テストは少しの算術を可能にするようですが、構文/スペースには少し難しいので、実行しないでください。


ptoへの割り当てがループの外で持続しない理由は、次を参照してください。

関連情報