一、概念
shell是一个命令行解析器,它读取用户输入,然后执行命令。
如果把 shell 命令比作盖房子的砖瓦,那 shell 脚本就是用一块块砖瓦建起来的房子了。我们可以通过一些约定的格式来将那些小巧的命令组合起来,实现更加自动化更加智能的所谓 shell 脚本。
二、脚本格式
脚本的第一行必须写成类似这样的格式:
#!/bin/bash 这是给系统指定一款shell解析器
myname="zhou"
echo $myname
脚本不需要编译,直接运行即可,首次运行记得赋予权限。
如:
# chmod u+x test.sh
# ./test.sh
三、变量
1.自定义变量 (如myname)
2.环境变量(PATH 环境变量的作用是保存系统中可执行程序或脚本的所在路径)
3.命令行变量 (如$# $* 脚本内部使用用户从命令行中传递进来的参数)
$0 代表脚本名称
$# 代表命令行个数
$* = $@ 代表所有参数
$n 第n个参数
$? 最后一个命令执行的返回值
$$ 代表当前shell的进程号PID
四、特殊符号
1.引号
"" ---双引号 里面可以包含字符,变量引用,和命令
echo "A=$A,today is `date`" 会将变量和命令进行转化
'' ---单引号 里面内容都是普通字符
echo "A=$A" 打印出来也是字符,不会转化
`` ---反引号 作用就是在双引号中标志初命令
echo `ls` 会打印命令执行的结果
2.管道 | (将前面的命令的执行结果输送给后面的命令)
ls -l | wc
3.重定向 >,<
ls -l > a.txt (将ls -l 的结果重定向到a.txt文件中)
五、测试语句
test可用[ ]代替 ;
1. test -e file 判断文件file是否存在(等同于[ -e file ] )
-r(可读) -w(可写) -x(可执行) -d(目录) -f(普通文件) -s(非空)
2. test s1 = s2 判断字符串s1和s2是否相同
!=(不同) <(长度小于) >(长度大于) -n(长度非0) -z(长度为0)
3. test n1 -eq n2 [ n1 -eq n2 ] 判断数值n1是否等于n2
-ne(不等于) -gt(大于) -ge(大于等于) -lt(小于) -le(小于等于)
六、脚本语法
(1)分支控制
if [ -e file] && [ -r file ] 判断文件是否存在且可读
then
cat file 若为真 则查看file内容
elif [ -e file] 否则 判断文件是否存在
then
chmod u+r file 若存在则给予读权限
cat file
else 否则创建文件
touch file
fi
代码中的分支语句的语法要点有这么几处:
1,每一个 if 语句都有一个 fi作为结束标记。
2,分支结构中使用 then 作为起始语句。
3,当 if 测试语句为真时,then 以下的语句才会被执行。
多路分支,可使用case语句:
read A
case $A in 判断用户输入的值$A
1) echo "one" 如果$A为1,则显示 one
;;
2) echo "one"
;;
*) echo "unknow" //*为通配符,代表任意字符
esac
(2)循环控制
while循环语句
declare -i A=0 //声明A为数值,不然默认是字符串
while [ $A -lt 100]
do
echo $A
A=$A+1
done
until循环语句
declare -i B=0
until [ B -eq 100]
do
echo $B
B=$B+1
done
for循环语句
file=`ls`
for a in $file
do
echo $a
done
注意:for 循环中,in 后面接的是一个字符串,字符串里面包含几个单词循环体就执行几遍,每执行一遍 a 的值都轮换地等于字符串里边的各个单词。
(3)函数
choose_max() 定义一个函数,不用写返回值和参数
{
if [ $1 -le $2 ]
then
return $2
else
return $1
fi
}
declare -i A=0
declare -i B=0
echo "input a"
read A
echo "input b"
read B
choose_max $A $B
if [ $? -eq $A ]
then
echo "A is max"
else
echo "B is max"
fi
注意几点:函数的定义中,括号里面不能写任何东西(第一行);函数必须定义在调用之前;给函数传参的时候,传递的参数在函数的定义里用$n 来表示第 n 个参数。$?代表函数调用的返回值。
七、shell中的运算
expr + - \* / %
`expr $a + $b` 计算a+b的值
`expr $(($a + $b)) \* $c`
`expr \( $a + $b \) \* $c`
例子:
declare -i a=10
declare -i b=20
declare -i c=30
echo `expr $a + $b`