专题 (三) 循环遍历
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"

浙公网安备 33010602011771号