1 for写法:

 

for 变量 in 列表; do
  循环体
done

 

for中列表的出现形式有如下两种:

{1..100} 表示从1到100

`seq 1 2 10` 表示从1开始 间隔2个 到10为止

 

for 写法方式2:

for (( expr1 ; expr2 ; expr3 )); do
  循环体
done

 

 

案例:

1 求1-100的总和

root@chinadaas109 zhoumingtest]# cat fortest.sh 
#!/bin/sh
#
declare -i sum=0
for i in {1..100}; do
  sum=$[$sum+$i]
done

echo "sum is: $sum"


2 依次向/etc/passwd中的每个用户问好

LINES=`wc -l /etc/passwd|cut -d' ' -f1`
for I in `seq 1 $LINES`; do echo "Hello, `head -n $I /etc/passwd | tail -1 | cut -d: -f1`"; done

 

打印1到10之间的奇数
$ cat  test.sh 
#!/bin/bash
#

for i in `seq 1 2 $1`; do
              echo $i
done

result:
$ sh test.sh 10
1
3
5
7
9

 

 

将1-100的奇偶和打印出来:

[root@chinadaas109 zhoumingtest]# cat test.sh 
#!/bin/bash
#
declare -i evensum=0
declare -i oddsum=0

for i in {1..100}; do
  if [ $[$i%2] -eq 0 ]; then
        let evensum+=$i
  else
        let oddsum+=$i
  fi
done

echo "evensum is: $evensum"
echo "oddsum is: $oddsum"


打印1-100的和:

#!/bin/bash
#
declare -i sum=0
for((i=1; i<=100; i++)); do
	let sum+=$i
done

echo $sum

 

 

 

 

 

 2 case语句

 

 语法:

case SWITCH in 
value1)
  statement
  ...
  ;;
value2)
  statement
  ...
  ;;
*)  *表示其余情况下的意思
  statement
  ...
  ;;
esac       是 case反过来写

 

 

使用案例:

根据输入不同的字符 显示不同的结果

#!/bin/bash
#
case $1 in 
[0-9])
  echo "a digit."
  ;;
[a-z])
  echo "Lower."
  ;;
[A-Z])
  echo "Upper."
  ;;
*)
 echo "Special character."
  ;;	
esac

 


只接受参数start,stop,restart,status其中之一:


只接受参数start,stop,restart,status其中之一
#!/bin/bash
#
case $1 in 
'start')
  echo "start server ..."
  ;;
'stop')
  echo "stop server ..."
  ;;
'restart')
  echo "restart server ..."
  ;;
'status')
  echo "status server ..."
  ;;  
*)
 echo "`basename $0` (start|stop|restart|status)"
  ;;	
esac


 3 while:


适用于循环次数未知的场景,要有退出条件
语法:
 while CONDITION; do
   statement
   ...
 done
 
计算100以内所有正整数的和

#!/bin/bash
declare -i I=1
declare -i SUM=0
while [ $I -le 100 ]; do
  let SUM+=$I
  let I++
done
echo $SUM


练习:转换用户输入的字符为大写,除了quit:
#!/bin/bash
#
read -p "Input something: " STRING

while [ $STRING != 'quit' ]; do
  echo $STRING | tr 'a-z' 'A-Z'
  read -p "Input something: " STRING
done


练习:每隔5秒查看hadoop用户是否登录,如果登录,显示其登录并退出;否则,显示当前时间,并说明hadoop尚未登录:
#!/bin/bash
#
who | grep "hadoop" &> /dev/null
RETVAL=$?

while [ $RETVAL -ne 0 ]; do
  echo "`date`, hadoop is not log." 
  sleep 5
  who | grep "hadoop" &> /dev/null
  RETVAL=$?
done


echo "hadoop is logged in."


 while + read  组合使用:


1) 显示一个菜单给用户:
d|D) show disk usages.
m|M) show memory usages.
s|S) show swap usages.
*) quit.
2) 当用户给定选项后显示相应的内容;
   
扩展:
当用户选择完成,显示相应信息后,不退出;而让用户再一次选择,再次显示相应内容;除了用户使用quit;
#!/bin/bash
#
cat << EOF
d|D) show disk usages.
m|M) show memory usages.
s|S) show swap usages.
*) quit.
EOF


read -p "Your choice: " CHOICE
while [ $CHOICE != 'quit' ];do
  case $CHOICE in
  d|D)
    echo "Disk usage: "
    df -Ph ;;
  m|M)
    echo "Memory usage: "
    free -m | grep "Mem" ;;
  s|S)
    echo "Swap usage: "
    free -m | grep "Swap" ;;
  *)
    echo "Unknown.." ;;
  esac


read -p "Again, your choice: " CHOICE
done