目录

expr

select

case

seq

break continue exit return


expr

expr命令一般用于整数值,但也可用于字符串。一般格式为:
expr argument operator argument
expr也是一个手工命令行计数器。

[root@localhost script]# expr 10 + 10
20

[root@localhost script]# expr 10 - 8
2

[root@localhost script]# expr 2 \* 3  反斜线屏蔽其特定含义
6

[root@localhost script]# expr 30 / 3 / 2
5


select

select 表达式是一种bash的扩展应用,动作包括:
   (1)、自动用1,2,3,4列出菜单 (没有echo指令,自动显示菜单)
   (2)、自动read输入选择 (没有 read指令,自动输入)
   (3)、赋值给变量  (没有赋值指令,自动输入数字后,赋值字符串给变量)


#!/bin/bash

echo "What is your favourite OS?"
select var in "Linux" "Gnu Hurd" "Free BSD" "Other";
do
break               select本身就是一个循环,break是当选择后,就跳出循环
done

echo "You have selected $var"

虽然select本身就是循环,但不建议用他的循环 ,因为select虽然循环却不再显示菜单,只循环输入,所以seleckt 语句干脆直接用break,只执行一次,在其上另配while循环

#!/bin/bash

while echo "display current netconfig:"
do

select vi in "ifconfig -a" "hosts" "netmasks" "quit"
do

case $vi in      虽然输入是1,2,3,4,5,但case变量输入值却是菜单项(字符串)
"ifconfig -a")  /sbin/ifconfig -a;;
"hosts") more hosts;;
"netmasks") more netmasks;;
"quit") exit 0;;
*) continue;;
esac

break  
done

done

这样以后菜单也跟着循环


case

格式  case WORD in [PATTERN [| PATTERN]...) COMMANDS ;;] esac

范例  case "$1" in

       start)

            ...

            ;;

       stop)

            ...

            ;;

       reload|restart)

            ...

            ;;

       *)

            echo "$usage: $0 {start|stop|reload|restart}"

            RETVAL=2

     esac

case里面的每一个分支变量中要想将空格作为字符串的一部分,就得加上引号 "reload program")


seq

用法:seq [选项]... 尾数
 或:seq [选项]... 首数 尾数
 或:seq [选项]... 首数 增量 尾数
以指定增量从首数开始打印数字到尾数。
 -f, --format=格式 使用printf 样式的浮点格式
 -s, --separator=字符串使用指定字符串分隔数字(默认使用:\n)
 -w, --equal-width 在列前添加0 使得宽度相同
     --help 显示此帮助信息并退出
     --version 显示版本信息并退出
如果省略了首数或者增量,则默认其值为1,即使这样尾数仍小于首数。
首数、增量和尾数均以浮点数形式解释。当首数小于尾数时增量一般为正值,
相反在首数大于尾数时增量一般为负数。
指定的格式必须适用于显示"double"类型的参数;当首数、增量和尾数均为指定
精确度的定点十进制数时默认为"%.精确度f",否则默认为"%g"。
从1循环到100的两种方法(bash 其它的shell没试过)
for x in `seq 1 100`;do echo $x;done
for x in {1..100};do echo $x;done
输出1-100中,不包含数字7,且不能被7整除的数
seq 100 | grep -v "7" | awk '$0%7!=0{print}'

另外,不用 seq 的话还可以这样:
[root@ubuntu]# for i in {1..10};do echo $i;done
1 和 10 之间是两个半角的点


-f 最常用 , 例如一次制做 10 個名 dir001 , dir002 .. dir010 的目錄,它便很有用途,我們可以
這樣下一個命令便可了
seq -f 'dir%03g' 1 10 | xargs mkdir

mkdir $(seq -f 'dir%03g' 1 10)
它用的是 printf 的格式 , %03g' 代表以三位浮點數,以此方法,如用bash3 的 printf
也可作為等價命令
printf 'dir%03d\n' {1..10} | xargs mkdir  或 mkdir `printf 'dir%03d ' {1..10}`
awk 當然也可以
awk 'BEGIN { while (num < 10 ) printf "dir%03d\n", ++num ; exit}' | xargs mkdir
這樣會比寫一個腳本快, 不必寫成
for dir in 001 002 003 004 005 006 007 008 009 010
do
    mkdir dir${dir}
done
我也常用 seq 下載一些用數字的 jpeg , 只要格式有數字順序便可,尤以一些 xxx site  ;)
for i in `seq -f '%02g' 1 20`
do
  if ! wget -P $HOME/tmp -c [img]http://www.xxxsite.com/photo/$i.jpg[/img] ; then
     wget -P $HOME/tmp -c $_
  fi
done

-s 選項主要改變輸出的分格符, 預設是 \n , 就是 newline
如用 -s 便可改變 , 如
seq -s ' ' 1 10
1 2 3 4 5 6 7 8 9 10  , 以空格作為分格,


break continue exit return
break
结束并退出循环
continue
在循环中不执行continue下面的代码,转而进入下一轮循环
exit
退出脚本,
常带一个整数给系统,如 exit 0
return
在函数中将数据返回
或返回一个结果给调用函数的脚本