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

在 shell 中进行算术运算的标准方法是$((..))。标准test/[仅支持比较和其他测试。因此,符合标准的版本将是:

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

(如果您包含数字,则仅需要引号IFS,因此通常不需要它们。)


在 Bash/ksh/zsh 中,您可以使用该(( .. ))构造,它的工作方式类似于命令并且也允许测试:

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

[[测试似乎允许一些算术,但它对语法/空格有点挑剔,所以你可能不应该这样做。


至于为什么对 to 的赋值p不会在循环之外持续存在,请参见

相关内容