加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

十六周四次课

发布时间:2020-12-14 03:21:43 所属栏目:大数据 来源:网络整理
导读:20.10 for循环 语法:for 变量名 in 条件; do …; done #!/bin/bashfor i in `seq 1 100`doecho $idone 案例1 #!/bin/bashsum=0for i in `seq 1 100`dosum=$[$sum+$i]echo $idoneecho $sum [[email?protected] script]# !vimvim for0.shecho $i#!/bin/bashsu
20.10 for循环

语法:for 变量名 in 条件; do …; done

#!/bin/bash

for i in `seq 1 100`

do

echo $i

done

案例1

#!/bin/bash

sum=0

for i in `seq 1 100`

do

sum=$[$sum+$i]

echo $i

done

echo $sum
[[email?protected] script]# !vim

vim for0.sh

echo $i

#!/bin/bash

sum=0

for i in `seq 1 100`

do

sum=$[$sum+$i]

done

echo $sum

"for0.sh" 7L,73C written
[[email?protected] script]# sh -x !$

sh -x for0.sh

+ echo 5050

5050
[[email?protected] script]# cat !$

cat for0.sh

#!/bin/bash

sum=0

for i in `seq 1 100`

do

echo "$sum+$i"

sum=$[$sum+$i]

echo $sum

done
[[email?protected] script]# !v

vim for1.sh

#!/bin/bash

cd /etc/

for a in `ls /etc`

do

[ -d $a ] && ls $a

if [ -d $a ]

then

echo $a

echo "`pwd`/$a"

ls $a

fi

done
[[email?protected] script]# for i in `seq 1 3`; do echo $i; done

1

2

3
[[email?protected] script]# for i in 1 2 3; do echo $i; done

1

2

3

注意for在遍历目录时会把空格或者回车作为分隔符

[[email?protected] script]# ll

total 64

-rw-r--r-- 1 root root  0 Apr 15 16:27 1

-rw-r--r-- 1 root root  0 Apr 15 16:27 2

-rw-r--r-- 1 root root  0 Apr 15 16:27 3 4.txt

[[email?protected] script]# mkdir textdir

[[email?protected] script]# mv 1 2 3 4.txt textdir/

1234.txt
[[email?protected] script]# for i in `ls ./textdir`; do echo $i; done

1

2

3

4.txt
[[email?protected] script]# for i in `ls ./textdir`; do printf "$in"; done

1

2

3

4.txt

通常情况下 shell 变量调用需要加 $,但是 for 的 (()) 中不需要,下面来看一个例子:

#!/bin/bash

for((i=1;i<=5;i++));do

echo "这是第 $i 次调用";

done;

与 C 中相似,赋值和下一步执行可以放到代码之前循环语句之中执行,这里要注意一点:如果要在循环体中进行 for 中的 next 操作,记得变量要加 $,不然程序会变成死循环。

20.11/20.12 while循环

语法 while 条件; do … ; done
案例1

#!/bin/bash
while :  ##:相当于true,可以使用while true
do
  load=`w|head -1|awk -F ‘load average: ‘ ‘{print $2}‘|cut -d. -f1`
  if [ $load -gt 10 ]
  then
      /bin/mail.py [email?protected] "load is high" $load
  fi
  sleep 30
done
[[email?protected] script]# sh -x while0.sh 
+ :
++ head -1
++ awk -F ‘load average: ‘ ‘{print $2}‘
++ cut -d. -f1
++ w
+ load=0
+ ‘[‘ 0 -gt 10 ‘]‘
+ sleep 30
+ :
++ head -1
++ awk -F ‘load average: ‘ ‘{print $2}‘
++ cut -d. -f1
++ w
+ load=0
+ ‘[‘ 0 -gt 10 ‘]‘
+ sleep 30
+ :
++ head -1
++ awk -F ‘load average: ‘ ‘{print $2}‘
++ cut -d. -f1
++ w
+ load=0
+ ‘[‘ 0 -gt 10 ‘]‘
+ sleep 30
^C

while循环: 格式:

while command 
    do 
    command 
    command 
    command 
    ... 
done
[[email?protected] script]# !vim
vim while1.sh 
#!/bin/bash
while :
do
  read -p "please input a number:" n
  if [ -z $n ]
  then
      echo ‘You need input a string.‘
      continue
  fi
  n1=`echo $n | sed ‘s/[0-9]//g‘`
  if [ -n "$n1" ]
  then
      echo "You must input numbers"
      continue
  fi
  break
done
echo $n
[[email?protected] script]# !sh
sh -x while1.sh
+ :
+ read -p ‘please input a number:‘ n
please input a number:12323
+ ‘[‘ -z 12323 ‘]‘
++ sed ‘s/[0-9]//g‘
++ echo 12323
+ n1=
+ ‘[‘ -n ‘‘ ‘]‘
+ break
+ echo 12323
12323
[[email?protected] script]# !vim
vim while2.sh
#!/bin/bash
i=1
while [ $i -le 5 ]
do sq=`expr $i * $i`
echo $i $i的平方是 $sq
i=`expr $i + 1`
done
echo "Job is done."
[[email?protected] script]# sh !$
sh while2.sh
1 1的平方是 1
2 2的平方是 4
3 3的平方是 9
4 4的平方是 16
5 5的平方是 25
Job is done.

20.13 break跳出循环

? 从循环中退出: break和continue命令 break 立即退出循环 continue 忽略本循环中的其他命令,继续下一下循环 在shell编程中有时我们要用到进行无限循环的技巧,也就是说这种循环一直执行碰 到break或continue命令。这种无限循环通常是使用true或false命令开始的。UNIX 系统中的true总是返0值,而false则返回非零值。如下所示

while true             until false         
do                 do
command              command 
....                  .... 
command              command 
done                  done

break命令允许跳出所有循环(终止执行后面的所有循环)

[[email?protected] script]# vim break.sh
#!/bin/bash
for i in `seq 1 5`
do
    echo $i
    if [ $i -eq 3 ]
    then
       break
    fi
    echo $i
done
echo "job is done"
[[email?protected] script]# sh break.sh 
1
1
2
2
3
job is done
[[email?protected] script]# sh -x break.sh 
++ seq 1 5
+ for i in ‘`seq 1 5`‘
+ echo 1
1
+ ‘[‘ 1 -eq 3 ‘]‘
+ echo 1
1
+ for i in ‘`seq 1 5`‘
+ echo 2
2
+ ‘[‘ 2 -eq 3 ‘]‘
+ echo 2
2
+ for i in ‘`seq 1 5`‘
+ echo 3
3
+ ‘[‘ 3 -eq 3 ‘]‘
+ break
+ echo ‘job is done‘
job is done

20.14 continue结束本次循环

忽略continue之下的代码,直接进行下一次循环
continue命令与break命令类似,只有一点差别,它不会跳出所有循环,仅仅跳出当前循环

[[email?protected] script]# vim continue.sh
#!/bin/bash
for i in `seq 1 5`
do
    echo $i
    if [ $i -eq 3 ]
    then
       continue
    fi
    echo $i
done
echo "job is done"
[[email?protected] script]# sh continue.sh 
1
1
2
2
3
4
4
5
5
job is done

20.15 exit退出整个脚本

[[email?protected] script]# cp continue.sh exit.sh
[[email?protected] script]# vim !$
vim exit.sh
#!/bin/bash
for i in `seq 1 5`
do
    echo $i
    if [ $i -eq 3 ]
    then
       exit
    fi
    echo $i
done
echo "job is done"
[[email?protected] script]# sh exit.sh 
1
1
2
2
3
[[email?protected] script]# !vim
vim exit.sh
#!/bin/bash
for i in `seq 1 5`
do
    echo $i
    if [ $i -eq 3 ]
    then
       exit 2
    fi
    echo $i
done
echo "job is done"
[[email?protected] script]# sh exit.sh 
1
1
2
2
3
[[email?protected] script]# echo $?
2

扩展

select用法 http://www.apelearn.com/bbs/thread-7950-1-1.html

select也是循环的一种,它比较适合用在用户选择的情况下。
比如,我们有一个这样的需求,运行脚本后,让用户去选择数字,选择1,会运行w命令,选择2运行top命令,选择3运行free命令,选择4退出。脚本这样实现:

#!/bin/bash
echo "Please chose a number,1: run w,2: run top,3: run free,4: quit"
echo
select command in w top free quit
do
    case $command in
    w)
        w
        ;;
    top)
        top
        ;;
    free)
        free
        ;;
    quit)
        exit
        ;;
    *)
        echo "Please input a number:(1-4)."
        ;;
    esac
done

执行结果如下:

sh select.sh
Please chose a number,4: quit

1) w
2) top
3) free
4) quit
#? 1
16:03:40 up 32 days,2:42,1 user,load average: 0.01,0.08,0.08
USER     TTY      FROM              [email?protected]   IDLE   JCPU   PCPU WHAT
root     pts/0    61.135.172.68    15:33    0.00s  0.02s  0.00s sh select.sh

#? 3
             total       used       free     shared    buffers     cached
Mem:       1020328     943736      76592          0      86840     263624
-/+ buffers/cache:     593272     427056
Swap:      2097144      44196    2052948
#?

我们发现,select会默认把序号对应的命令列出来,每次输入一个数字,则会执行相应的命令,命令执行完后并不会退出脚本。它还会继续让我们再次输如序号。序号前面的提示符,我们也是可以修改的,利用变量PS3即可,再次修改脚本如下:

#!/bin/bash
PS3="Please select a number: "
echo "Please chose a number,4: quit"
echo
select command in w top free quit
do
    case $command in
    w)
        w
        ;;
    top)
        top
        ;;
    free)
        free
        ;;
    quit)
        exit
        ;;
    *)
        echo "Please input a number:(1-4)."
    esac
done

如果想要脚本每次输入一个序号后就自动退出,则需要再次更改脚本如下:

#!/bin/bash
PS3="Please select a number: "
echo "Please chose a number,4: quit"
echo
select command in w top free quit
do
    case $command in
    w)
        w;exit
        ;;
    top)
        top;exit
        ;;
    free)
        free;exit
        ;;
    quit)
        exit
        ;;
    *)
        echo "Please input a number:(1-4).";exit
    esac
done

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读