1、case流程控制

  
case "$key" in  
[a-z])  
echo "小写字母"  
;;  
[A-Z])  
echo "大写字母"  
;;  
*)  
echo "其它字符"  
esac  

2、for循环

  
for $key in list  
do  
....  
done  

如 可以for num in 12 33 35
取文件内容 for word in $(cat /etc/host.conf)
$()用来执行其它指令,并把结果返回
例子:

  
for name in $(cat user.txt)  
do  
useradd $name  
echo "123456" | passwd -stdin $name  
chage -d 0 $name #让用户的密码过期,强制让其重新设置密码  
done  

2、if判断

  
if 条件  
then ...  
fi  

很简单,其中的条件,每个判断可以用[ ]来包起来
例子:

  
if [! -d '/home/json'] #-d用来判断是否是一个文件夹  
then  
echo "文件夹不存在"  
fi  

then可以并列一个else,多if的可以用elif

3、字符串

  • 字符串截取
  
str="/etc/host.conf"  
dirname $str     #得到/etc  
basename $str    #得到host.conf  
#用substr:  
expr substr $str 6 10      从位置6截取10个长度,得到host.conf。注意这里是从1开始算起的  
echo ${str:5:10}   一样的结果,这里是从0开始算起的。可空  
  • 替换
  
echo ${str/old/new}    str的值不变。这个只会替换一个,要全部替换,使用下面的:  
echo ${str//old/new}  使用两个/     在vi里面也有类似的,不过它表示全部替换时是用/g  
  • 生成随机串
  
head -1 /dev/urandom | md5sum | cut -b 0-9  

cut中0可省略。/dev/urandom是用来产生随机字符的设备。md5sum得到md5摘要,结果后面有空格和横杠,用cut来截取需要的。

4、条件测试
test 或者[条件]
[-d /home/abc] && echo YES 如果/home/abc是目录,则打印出YES
参数有:
-e 是否存在exist
-d 是否是目录
-f 是否是文件
-x 是否可执行
-r 是否可读
-w 是否可写
另外数值比较:
-eq 等于 -ne 不等于 -gt 大于 -lt 小于 -ge 大于等于 -le 小于等于
例子:

  
[$(who | wc -l) -eq 2] && echo YES  
  • 字符串比较 =和!=

5、其它
(1)find /etc -name "*.conf" -type f | wc -l 统计/etc目录下所有的conf后缀的文件(算出个数)
(2)标准错误输出:
2>、2» 将错误信息覆盖、追加到文件中
(3)正常输出和错误输出一起
&>、&»
(4)||来隔开两个命令,那么第一个执行如果成功,第二个就不会执行。
mkdir /home/abc 2>/dev/null && echo "创建成功"
换成||就echo "执行失败"
(5)分隔符来分隔多个命令,则前面的执行完后,会回车再执行第二个
(6)双引号:允许引用和转义
单引号禁止引用、转义
$(命令) 或 `命令`
特殊的反撇号引起来的表示执行后用结果替换当前位置
(7)系统变量
可以用 env | awk -F= '/=/ {print $1}' 来查看
(8)脚本特殊变量
$? 前一条命令的状态值,0为执行正常
$0 脚本自身的程序名
$1-9 第1-9个参数
$* 命令行的所有参数
$# 命令行的参数个数
(9)运算

  
expr 1+1  
#乘法要注意,expr 1\*2  
x=11; y=22; echo $[x+y]  

$[]放中括号里面的变量不用再加$
自增自减等用let let x++ let x+=2 let后的变量不用再加$
(10)随机数 $RANDOM
值默认是从0到32767
(11)生成序列,像python里面的range,shell里面用seq
seq 3 输出1 2 3
seq 2 4 输出2 3 4
seq 3 2 10 中间的数表示step,输出3 5 7 9
(12)小数运算
使用bc

  
echo "23.31-18.97" | bc  
#用除法时可以用scale来限定小数的位数:  
echo "scale=4;10/3" | bc