butter7372 发表于 2018-8-20 10:34:07

shell脚本forloops&whileloops题解

一、for loops
  for 变量名 in 列表;do
  循环体
  done
  执行机制:
  依次将列表中的元素赋值给“变量名”; 每次赋值后即执行一次循环体; 直
  到列表中的元素耗尽,循环结束
  列表生成方式:
  (1) 直接给出列表
  (2) 整数列表:
  (a) {start..end}
  (b) $(seq ] end)
  (3) 返回列表的命令
  $(COMMAND)
  (4) 使用glob,如:.sh
  (5) 变量引用;
  $@, $

for loops c风格格式
  双小括号方法,即((…))格式,也可以用于算术运算
  双小括号方法也可以使bash Shell实现C语言风格的变量操作
  I=10
  ((I++))
  for循环的特殊格式:
  for ((控制变量初始化;条件判断表达式;控制变量的修正表达式))
  do
  循环体
  done
  控制变量初始化:仅在运行到循环代码段时执行一次
  控制变量的修正表达式:每轮循环结束会先进行控制变量修正运算,而后再做
  条件判断

1、判断/var/目录下所有文件的类型
  

for files in   /var/* ;do  if [[ -f $files ]];then
  echo "$files exists and is a regular file."
  elif [[ -h $files ]] ;then
  echo "$files is a symbolic link."
  elif [[ -d $files ]] ;then
  echo "$files is a directory."
  else
  echo "$files is others."
  fi
  
done
  

2、添加10个用户user1-user10,密码为8位随机字符
  

for user in user{1..10} ;do  id $user &> /dev/null
  if [[ $? -ne 0 ]] ;then
  useradd $user
  
#openssl rand -base64 6; uuidgen |cut -c8
  pw=`openssl rand -base64 6`
  echo$pw|passwd --stdin$user &> /dev/null
  echo "user:$user, password : $pw" >> /root/pw_file
  else
  echo "Error:$user is exsit"
  exit
  fi
  if [ $user == "user10" ] ;then
  echo "user is created,password is in/root/pw_File"
  fi
  
done
  

  #删除10个用户
  for i in {1..10} ;do userdel -r user$i ;done

3、/etc/rc.d/rc3.d目录下分别有多个以K开头和以S开头的文件;分别读取每个文件,以K开头的输出为文件加stop,以S开头的输出为文件名加start,如K34filename stop S66filename start
  

  
for files in /etc/rc.d/rc3.d/* ;do
  if [ `basename $files|cut -c1` == "K" ] ;then
  echo "$files stop"
  else
  echo "$files start"
  fi
  
done
  

4、编写脚本,提示输入正整数n的值,计算1+2+…+n的总和
  

read -p "please input a positive integer: " INT  
if [[ $INT =~ ^+$ ]] && [[ `expr $INT` != 0 ]] ;then
  sum=0
  for i in `seq $INT`;do
  let sum+=i
  done
  echo "sum=$sum"
  
else
  echo "Error:your input is not positive integer"
  
fi
  

5、计算100以内所有能被3整除的整数之和
  

sum=0  
for i in `seq 3 3 100` ;do
  let sum+=i
  
done
  
echo "sum=$sum"
  

for((i=3,sum=0; i>/root/ipup.txt
  if [ $IPC -eq 0 ] ;then
  for IP1 in {0..254} ;do
  for IP2 in `seq 254`;do
  {
  ping -c1 -w1$IPCHECK$IP1.$IP2 &> /dev/null
  [ $? -eq 0 ] && echo "The host $IPCHECK$IP1.$IP2run up" >> /root/ipup.txt
  }&
  done
  wait
  done
  else
  echo "your IP $IP is not available"
  fi
  
else
  echo "your IP $IP format is wrong"
  
fi
  

7、打印九九乘法表
  

for i in {1..9};do  for j in `seq $i`;do
  echo -en "$i*$j=$(($i*$j))\t"
  done
  echo
  
done
  

8、在/testdir目录下创建10个html文件,文件名格式为数字N(从1到10)加随机8个字母,如:1AbCdeFgH.html
  

for i in {1..10};do  NUM=`openssl rand -base64 6|tr -dc '[:alpha:]' |head -c10`
  touch /data/${i}${NUM}.html
  
done
  
unset NUM
  

9、打印等腰三角形
  

read -p "please input the triangle number: " NUM  
for n in `seq $NUM` ;do
  
{
  for a in `seq $[$NUM-$n]` ;do
  echo -n " "
  done
  for b in `seq $` ;do
  color=$
  echo -en"\033[1;${color}m*\033[0m"
  done
  echo
  
}&
  
done
  

  1.

  2.

  3.

  4.

  5.

  6.

  7.

  8.

  9.


while loops
  while CONDITION; do
  循环体
  done
  CONDITION:循环控制条件;进入循环之前,先做一次判断;每一次循环之后
  会再次做判断;条件为“true”,则执行一次循环;直到条件测试状态为
  “false”终止循环
  因此:CONDTION一般应该有循环控制变量;而此变量的值会在循环体不断地
  被修正
  进入条件:CONDITION为true
  退出条件:CONDITION为false

while循环的特殊用法(遍历文件的每一行):
  while read line; do
  循环体
  done < /PATH/FROM/SOMEFILE
  依次读取/PATH/FROM/SOMEFILE文件中的每一行,且将行赋值给变量line

1、编写脚本,求100以内所有正奇数之和
  

declare -i i=1  
declare -i sum=1
  
while [ $i -le 100 ] ;do
  let i+=2
  let sum+=i
  
done
  
echo sum=$sum
  

2、编写脚本,提示请输入网络地址,如192.168.0.0,判断输入的网段中主机在线状态,并统计在线和离线主机各多少
  

IPNET=192.168.  
i=0
  
tmp=/root/ping.txt
  
for ((i=0;i /dev/null
  if [ $? -eq 0 ] ;then
  let sumup++
  echo "${IPNET}${i}.${j} is up"|tee -a$tmp
  fi }&
  let j++
  done
  wait
  
done
  
up=`cat $tmp |wc -l`
  
down=$
  
echo "host up is $up"
  
echo "host down is $down"
  

3、编写脚本,打印九九乘法表
  

declare -i i=1  
while [ $i -le 9 ] ;do
  declare -i j=1
  while [ $j -le $i ] ;do
  echo -en "${i}x${j}=$(($i*$j))\t"
  let j++
  done
  echo
  let i++
  
done
  

4、编写脚本,利用变量RANDOM生成10个随机数字,输出这个10数字,并显示其中的最大值和最小值
  

file=/root/rand4.txt  
declare -i i=1
  
if [ ! -f $file ] ;then
  >$file
  
else
  rm -f $file
  
fi
  
while [ $i -le 10 ] ;do
  echo $RANDOM |tee -a $file
  let i++
  
done
  
echo max `cat $file |sort -nr|head -n1`
  
echo min `cat $file |sort -nr|tail -n1`
  

5、编写脚本,实现打印国际象棋棋盘
  默认背景色为黑色
  

clear  
while read -p "please input a number(8,16,32,64):" num ;do
  if [[ $num =~ ^{1,2}$ ]];then
  if [ $(($num%8)) -eq 0 ] ;then
  break
  fi
  else
  echo "Error:your input is illegal"
  fi
  
done
  
el=$[$num/4]
  
al=$[$num/8]
  
space=`seq $el |sed -r 's/\b+\b//g'|tr "\n" " "`
  
for i in `seq $num`;do
  for j in {1..4};do
  if [[ $(($i%$el)) =~ ^$ ]] ;then
  echo -ne "\033[1;47m${space}\033[0m$space"
  else
  echo -ne "$space\033[1;47m${space}\033[0m"
  fi
  done
  echo
  
done
  

6、后续六个字符串:efbaf275cd、4be9c40b8b、44b2395c46、f8c8873ce0、b902c16c8b、ad865d2f63是通过对随机数变量RANDOM随机执行命令: echo $RANDOM|md5sum|cut –c1-10 后的结果,请破解这些字符串对应的RANDOM值
  

md5file=/root/rand_file  
NUM="efbaf275cd 4be9c40b8b 44b2395c46 f8c8873ce0 b902c16c8b ad865d2f63"
  
i=1
  
if [ ! -f $md5file ];then
  while [ $i -le 65533 ];do
  j=`echo $i |md5sum |cut -c1-10`
  echo $j $i>>$md5file
  ((i++))
  done
  
else
  for k in $NUM;do
  grep $k $md5file
  done
  
fi
  

  1.

  2.

  3.

  4.

  5.

  6.



页: [1]
查看完整版本: shell脚本forloops&whileloops题解