内容を含むファイルがあります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 ...
この[[
テストは少しの算術を可能にするようですが、構文/スペースには少し難しいので、実行しないでください。
p
toへの割り当てがループの外で持続しない理由は、次を参照してください。