1.什么是shell脚本
shell有很多种脚本:bash,csh,ksh等等。不同的shell语法不同。
脚本中的#表示注释,但是第一行中的#有特殊意义:
如果第一行中第一个字符非#,表示这是一个bash脚本。第一个字符是#,但第二个字符不是!,表示这是一个csh脚本。第一个字符是#,且第二个字符是!,举例,如果第一行为#!/usr/bin/python2.0表示调用其后指定的/usr/bin/python2.0程序来执行以下脚本。
#!/bin/sh是bash的一个软链接。#!/bin/sh=#!/bin/bash
2.bash脚本不支持正则表达式,只支持通配符。正则表达式可以通过grep,vi,sed和awk命令支持。
3.与shell脚本进行交互
使用参数来传递内容:
$1,$2...表示该shell脚本接收的第一个和第二个参数,以此类推。
$# 表示实际调用该shell脚本用户输入参数的数目
$? 表示shell脚本中$?的上一个命令是否成功执行.0成功,非0失败。
$$ 表示该shell脚本的进程id,即pid
使用命令来交互
read 读入数据给变量 例子:read -p "please input your name:" AAA, -p表示先打印出字符串 然后用户输入名字给AAA变量
echo 输出数据
printf 输出数据 printf与echo功能类似,printf控制的字符格式功能要多一些。例子 printf "/t hello world /t /n"
4.调用shell脚本的三种方式
a.输入脚本的绝对路径或相对路径
/root/backup.sh
./backup.sh
b.指定定要执行的shell(bash或tcsh)
bash /root/backup.sh
c.在脚本的路径前加.
. /root/backup.sh
. ./backup.sh
第三种与前两种的差别是,c执行方式是在当前shell执行,a,b是开一个子shell执行。如果是a,b两种方式的话,在里面有export x=2的脚本,其父shell无法读取x变量值。而c方式可以读取脚本里面赋值的变量。通常在我们需要调用脚本中的变量,函数时使用c方式。
5.bash脚本的流程控制
a.条件判断控制:
[],&&, ||
if
case
[abc] 可能是a,b,c字符中的任一个
[ abc ] []里面两边有空格,判断a,b,c变量的真假也就是是否有ascii码的值,0为true,1为false
例子
[ abc ],echo $? 显示0
[ ],echo $? 中括号里面是空值,显示1
&& 表示前面值为真(即0)时执行&&右边的命令,否则不执行右边命令
|| 表示前面值为假(即1)时执行||右边的命令,否则不执行右边命令
if使用例子
read AAA
if [ $AAA = feifei ]
then
echo hello feifei
elif[ $AAA = root ]
then echo hello root
else echo 'get out!'
fi
if,then,elif,else可自由多次组合。
题外话
bash -v ./test.sh 起调试作用,表示用bash执行./test.sh脚本,执行过程可见.
bash -vx ./test.sh 可以看更详细的调试过程,-x可以显示脚本里面各变量的值。
case多重判断使用例子:
read AAA
case $AAA in
shrek )
echo hello shrek
echo nice to meet you
;;
root )
echo hello root
echo 'I miss you!'
;;
* )
echo get out!
esac
b.循环控制 for while until break continue
for循环使用
实例1
#!/bin/bash
AAA=`pgrep httpd` --讲httpd的进程idPID赋值给AAA
[-z "$AAA" ] && echo 'httpd is not running!' &&exit --有可能AAA是多个PID加空格
for i in $AAA
do
kill -9 $i --do,done之间组成循环体
done
echo httpd is killed
实例2
for aaa in 111 222 333 /etc/profile.d/*.sh
do
echo $aaa
done
实例3
for aaa in `seq 1 100` --产生1到100序列,脚本执行100次
do
echo -n $aaa; -- -n为连续输出,不回车
sleep 1; --休息一秒
done
while循环
实例1
i=0
while [ $i -lt 100 ]
do
i=$[$i+1]
echo -n "$i "
done
实例2
while true
do
read AAA
if[ "$AAA" = "exit" ]
then
break
fi
done
until循环,与while的区别是条件为false时执行,为true时退出循环
实例
i=0
until [ $i -gt 100 ]
do
i=$[$i+1]
echo -n "$i "
done
6.函数的使用
函数的定义:
Myfunction()
{
}
取消函数使用:
unset myfunction 或 unset 变量名
如何给函数传递参数和获得返回值?Bash中函数参数的定义并不需要在函数定义处就指定,而只需要在函数被调用时用BASH的保留变量$1$2...来引用就可以了;Bash的返回值可以用return语句来指定返回一个特定的整数,如果没有return语句显示的返回一个返回值,则返回值就是该函数最后一条语句执行的结果(一般为0,如果执行失败返回错误码)。return的返回值只能是0~256之间的一个整数,函数的返回值在调用该函数的程序体中通过$?保留字来获得。
实例1:计算平方的函数
square(){
aaa=$1^$1
return $aaa
}
square $1
result=$?
echo $result
exit 0