专题 (三) 循环遍历

1、for

1.1 for 循环 使用 (())

local _data_size=${#database_pool[@]}
for ((j=1;j<=_data_size;j++)){ 
  _map_str=${database_pool[$j]}
  echo $_map_str
}

使用方法和java的语法有些类似

1.2 shell 脚本中for 循环遍历通过查询(如:grep)返回的多行数据

pids=$(ps -ef|grep consul-product.jar|grep -v grep |awk '{print $2}')
   echo pids=$pids  >> $LOGS_DIR/stop.log>&1
   array_name=($pids)
   for pid in ${array_name[*]}
   do
      echo "kill ${pid}" >> $LOGS_DIR/stop.log>&1
      kill -9 $pid >> $LOGS_DIR/stop.log>&1
   done

说明点:

(1) pids 是变量,在赋值的时候,该变量后面的等号前后不能有空格;

(2) 通过在脚本开头第一行 #!/bin/bash 后面加上 -xv,可以进入调试模式,此时 以上的语句 执行出来的效果是:

      array_name=($pids) 将 pids转换成了数据,使用 for xx in 数据进行循环遍历。

(3) 将一个命令执行返回的多行数据返回给一个变量时,需要使用  $(命令),才会执行括号里面的命令,若没有 $(),则必须使用 `命令`,如下:

count=`ps aux|grep consul-product.jar |grep -v grep |wc -l`

2、while

2.1 循环是一个条件

num=1

while [ $num -le 10  ]
do
        SUM=`expr $num \* $num`
        echo $SUM
        num=`expr $num + 1`
done

2.2  循环条件是一个固定值

num=1

while true
do
   if [ $i -ge 3 ];then
       break;
   fi
   let num++
done

3、实战

3.1 遍历某个目录下的所有文件

第一种方法

for file in $dir/*;do
   echo $file   #输出的是file的绝对路径
done

第二种方法

#! /bin/bash

function read_dir(){
for file in `ls $1` #注意此处这是两个反引号,表示运行系统命令
do
 if [ -d $1"/"$file ] #注意此处之间一定要加上空格,否则会报错
 then
 read_dir $1"/"$file
 else
 echo $1"/"$file #在此处处理文件即可
 fi
done
}
#读取第一个参数
read_dir $1

3.2 遍历文件中的每行

while read line;do
 #过滤注释
  if [ `grep -e '^\s*#' $line |wc -l` -ne 0 ];then
    continue
  fi
  echo $line
  let i++
done < $service_status_conf
 for LINE in `cat $file`
   do
	echo $LINE 
  done

3.3 利用管道符记录日志文件

xxx.sh 内容如下
echo ".......start......"
echo "hello"
echo "......end......"

main.sh 内容如下
function WriteLog() { local logfile
=$1 while read line do echo "$line" echo "$line" >> "$logfile" done }

echo "*****preparing..." | WriteLog "$setuplog"
bash xxx.sh |
WriteLog "$setuplog"

 

 

 

  

 
 
 
posted @ 2022-10-25 19:28  夏之夜  阅读(37)  评论(0)    收藏  举报