shell脚本for循环

Shell循环:for

循环次数是固定的

=====================

Shell:

for  变量名  [in  取值列表]

do

循环体

done

C语言:

for((初值;条件;步长))

do

循环体

done

=====================

Shell循环:while  until

循环次数不一定是固定的

可以固定

可以不固定

while语句:

while  条件测试

do

循环体

done

功能:当条件测试成立(条件测试为真),执行循环体。

=====================

until语句:

until  条件测试

do

循环体

done

功能:当条件测试成立(条件测试为假),执行循环体。

=====================

案例1:循环输出变量i的值。下例可直接在命令行测试。

for   i  in  a  b  c  d

do

echo  $i

done

=====================

案例2:批量ping测试主机,并发方式。

vi   pi.sh   脚本代码如下

#!/usr/bin/env   bash

trap  "echo  ok;exit 3"  INT

for  i  in  {1..254}

do

(

ip=192.168.100.$i

ping  -w.2  -i.1 -c1  $ip | grep -q ‘ttl‘

[ $?  -eq 0 ] &&  echo "$ip  is  up" || echo "$ip  is down"

) &

done

wait

echo  "finish...."

测试效率:time  sh  pi.sh

=====================

案例1:写脚本s1.sh。提示用户输入功能选项,回车后执行相关的命令。

vi   s1.sh   脚本代码如下

#!/bin/bash

#trap  "echo  ok;exit;"   HUP  INT  QUIT  TSTP

while  :

do

cat  <<-EOF

1.web1

2.web2

3.mysql1

EOF

read  -p  "input  number[1-3]:"  num

case  $num  in

1)

#ssh   [email protected]

ping  -c 4  127.0.0.1

;;

2)

#ssh   [email protected]

ping  -c 4 127.0.0.2

;;

3)

#ssh   [email protected]

ping  -c 4 127.0.0.3

;;

‘‘)

true

;;

*)

echo  "error"

break

;;

esac

done

----------------------------------------

案例3:多主机推送公钥。

vi  skey.sh

#!/usr/bin/env  bash

#get  ip

>/tmp/ip_yes.txt

>/tmp/ip_no.txt

if [ ! -f  ~/.ssh/id_rsa ];then

ssh-keygen  -t  rsa  -P ""  -f  ~/.ssh/id_rsa

fi

rpm  -q  expect  &> /dev/null

if [ $? -ne  0 ];then

yum  install  -y  expect

fi

for  i  in  {1..254}

do

{

ip=192.168.100.$i

ping  -W.2  -i.1 -c1  $ip &> /dev/null

if [ $?  -eq 0 ];then

echo "$ip  is  up" | tee  -a  /tmp/ip_yes.txt

/usr/bin/expect <<-EOF

set  timeout  10

spawn  ssh-copy-id  $ip

expect {

"yes/no"  { send  "yes\r"; exp_continue }

"password:" { send "012\r" }

}

expect  eof

EOF

else

echo "$ip  is  down" | tee  -a  /tmp/ip_no.txt

fi

}&

done

wait

echo  "finish...."

=====================

案例4:{}&并发的批量修改ssh服务器上的sshd_config配置文件、selinux配置文件,关闭防火墙。

第1步:准备/opt/ip.txt文件。

cat  > /opt/ip.txt <<EOF

192.168.10.2

192.168.10.25

192.168.10.26

EOF

第2步:创建脚本。

vi  ssh.sh

#!/usr/bin/env  bash

for  ip  in  $(cat  /opt/ip.txt)

do

{

ssh  $ip  "sed  -ri  ‘/^#UseDNS/c\UseDNS  no‘  /etc/ssh/sshd_config"

ssh  $ip  "sed  -ri  ‘/^GSSAPIAuthentication yes/c\GSSAPIAuthentication no‘  /etc/ssh/sshd_config"

ssh  $ip  "service  iptables  stop;chkconfig  iptables  off"

ssh  $ip  "sed  -ri  ‘/^SELINUX/c\SELINUX=permissive‘  /etc/selinux/config"

ssh  $ip  "setenforce  0"

}&

done

wait

echo  "finish..."

=====================

案例4:多主机修改密码。

vi  modify_passwd.sh

#!/usr/bin/env  bash

#change  password

#v1.0  by  flyer  08/10/2017

read  -p  "Please input a New  Password:"  pass

for  i  in  {1..100}

do

{

ip=192.168.100.$i

ping -c1  -W1  $ip &>/dev/null

if [ $? -eq 0 ];then

ssh  $ip "echo  $pass | passwd  --stdin  root"  &> /dev/null

if  [ $?  -eq  0 ];then

echo  "$(date +%F)  $ip  up" >> /tmp/ok.txt

else

echo  "$(date +%F)  $ip  down" >> /tmp/fail.txt

fi

else

echo "$(date +%F)  $ip  down" >> /tmp/fail.txt

fi

}&

done

wait

echo  "all  ok...."

=====================

案例:for批量创建用户。

第1步:准备用户名单文件。

cat  > /tmp/user.txt <<EOF

tom

jack

lucy

EOF

第2步:创建脚本文件。

vi  useradd.sh

#!/usr/bin/env  bash

#useradd2

pass=111

red_col="\e[1;31m"

reset_col="\e[0m"

if [ $# -eq 0 ];then

echo "Usage: $(basename $0)  file"

exit 1

fi

if [ ! -f  $1 ];then

echo "Error  File!"

exit  2

fi

for  user  in  $(cat  $1)

do

id  $user  &> /dev/null

if [ $?  -eq  0 ];then

echo "$user already  exites"

else

useradd  $user

echo "$pass" | passwd  --stdin  $user  &>/dev/null

if [ $? -eq 0 ];then

echo  -e  "${red_col}${user}${reset_col} create"

fi

fi

done

第3步:测试语法,并测试脚本的运行。

sh  -n  useradd.sh

chmod  +x  useradd.sh

./useradd.sh   /tmp/user.txt

===============================================

案例:批量创建用户。

vi  useradd3.sh

#!/bin/bash

while :

do

read  -p  "Please enter name & password & num & mode[add/del]:" name pass num mode

printf "user information:

-----------------------------

user name: $name

user passwd: $pass

user number: $num

user mode: $mode

-----------------------------

"

read  -p  "Are  you sure?[y/n]:"  action

if [ "$action"  =  "y" ];then

break

fi

done

case  $mode  in

add)

for  i  in  $(seq  -w  $num)

do

user=${name}${i}

useradd  $user

echo  "$pass" | passwd  --stdin  $user  &>/dev/null

if [ $? -eq 0 ];then

echo  "$user  is created"

fi

done

;;

del)

for  i  in  $(seq  -w  $num)

do

user=${name}${i}

userdel  -r  $user  &>/dev/null

if [ $? -eq 0 ];then

echo  "$user  is deleted"

fi

done

;;

*)

echo  "Program  exit"

exit  0

;;

esac

-----------------------------

案例:用for的c风格写批量ping的基本脚本.

vi  pi2.sh

#!/bin/bash

for ((i=1;i<=10;i++))

do

{

ip=192.168.100.$i

ping   -c  1  -W1  $ip |grep  ttl

}&

done

wait

echo  "finish..."

=============================

案例:while自动切换网关。

vi  gw.sh

#!/bin/bash

gw1=192.168.100.3

gw2=192.168.100.2

while  :

do

ip  r  del  default

ip  r  add  via  $gw1

while  ping  -c1  $gw1  &>/dev/null

do

sleep  1

done

ip  r  del  default

ip  r  add  default  via  $gw2

until  ping  -c1  $gw1  &>/dev/null

do

sleep  1

done

done &

时间: 2024-10-12 16:46:37

shell脚本for循环的相关文章

Shell脚本-----while循环和until循环

while 测试条件 do 语句1 语句2 done 测试条件:条件满足就循环,直到条件不满足就退出循环 while循环如何退出?在循环体中改变测试条件相应的变量值 补充:算术运算符 sum=$[$sum+$i] = sum+=$i -= *= sum+=1 = let sum++ sum-- sam=3 while [ $sam - le 5 ] do let sam++ done 例子:用户随机输入一个数值,就循环几次echo "test" >> /tmp/123  #

shell 脚本之循环使用 for while 详解

任何一种编程语言中循环是比不可少的,当然 shell 脚本也少不了循环语句,包括 for 语句. while 语句.文中主要以实际用例来说明 for while 都有哪些常见的使用方法和技巧. 一.for 循环使用 1. seq 命令方式 for i in $(seq 10);do echo "$i" done 2. C语言语法方式 for ((i=0; i<9; i++));do echo "$i" done 3. 循环遍历文件列表 for file in

编写简单的shell脚本 - for循环 - 解决报错 Syntax error: Bad for loop variable

为了编写批量导入数据的程序,故而学习编写shell脚本!现学现用! ============================================ 1.第一个简单的for循环 #!/bin/bashfor i in 1 2 3 4;do echo $i;done 2.测试for的自增长的循环: #!/bin/bashfor ((i=1; i<=5; i++))do echo $i;done 如果会报错,没有则跳过: Syntax error: Bad for loop variable

shell脚本编程-循环(for、while、until)

for命令格式:– list参数:迭代中要用的一系列值– 每个迭代中,变量var会包含列表中的当前值– do和done语句之间输入的命令可以是一条或多条标准的bash shell命令 1 2 3 4 for var in list do commands done 读取列表中的值 for命令最基本的用法就是遍历for命令自身中定义的一系列值: 在最后一次迭代后,$test变量的值会在shell脚本的剩余部分一直保持有效,除非修改它 1 2 3 4 5 6 7 8 9 10 11 12 13 14

Linux python3安装/shell脚本/if/循环/函数

python3安装 安装过程 安装包: wget https://www.python.org/ftp/python/3.7.0/Python-3.7.0.tgztar -xvf Python-3.7.0.tgz #解压 基础包 1.基础yum包 yum install gcc yum install zlib yum install zlib-devel yum install libffi-devel -y yum install openssl openssl-devel -y 检测平台:

shell 脚本-for 循环

语法一 for 变量 in 值1 值2 值3 ... do 程序 done 实例1 1 #!/bin/bash 2 shijian="zaoshang zhongwu xiawu wanshang" 3 for time in "$shijian" 4 do 5 echo $time 6 done 实例2 1 #!/bin/bash 2 for i in 1 2 3 4 5 6 3 do 4 echo $i 5 done 语法 二 for (( 初始值:循环条件:变

shell脚本编程循环之for/while/untill循环

循环执行: 将一段代码重复执行0.1或多次: 进入条件:条件满足时才进入循环: 退出条件:每个循环都应该有退出条件,以有机会退出循环: bash脚本: for循环 while循环 until循环 for循环: 两种格式: (1) 遍历列表 (2) 控制变量 (1)遍历列表: for  VARAIBLE  in  LIST; do 循环体 done 进入条件:只要列表有元素,即可进入循环: 退出条件:列表中的元素遍历完成: LISTT的生成方式: (1) 直接给出: (2) 整数列表 (a) {s

shell脚本 for循环、break跳出循环、continue结束本次循环

20.10 for循环 语法:for 变量名 in 条件; do ...; done ;案例1 [[email protected] shell]# cat for.sh #!/bin/bash sum=0 for i in `seq 1 100` do sum=$[$sum+$i] done echo $sum #输出的结果 [[email protected] shell]# sh for.sh 5050 文件列表循环 [[email protected] shell]# cat for2.

shell 脚本 之循环 for while until 和 软件包的管理 【上】

循环执行 将某代码段重复运行多次 重复运行多少次: 循环次数事先已知 循环次数事先未知 有进入条件和退出条件 for, while, until for 变量名 in 列表;do 循环体 done 执行机制: 依次将列表中的元素赋值给"变量名"; 每次赋值后即执 行一次循环体; 直到列表中的元素耗尽,循环结束 列表生成方式: (1) 直接给出列表 (2) 整数列表: (a) {start..end} (b) $(seq [start [step]] end) (3) 返回列表的命令 $