我有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
在 shell 中进行算术运算的标准方法是$((..))
。标准test
/[
仅支持比较和其他测试。因此,符合标准的版本将是:
if [ "$(( p % 2 ))" -ne 0 ]; then...
(如果您包含数字,则仅需要引号IFS
,因此通常不需要它们。)
在 Bash/ksh/zsh 中,您可以使用该(( .. ))
构造,它的工作方式类似于命令并且也允许测试:
if (( p % 2 != 0 )); then ...
该[[
测试似乎允许一些算术,但它对语法/空格有点挑剔,所以你可能不应该这样做。
至于为什么对 to 的赋值p
不会在循环之外持续存在,请参见