shell脚本简单的基本语法
1.脚本的格式要求
1.脚本以#!/usr/bash开头,表示编写的脚本以bash这种终端解释器来解析。
2.脚本必须要有可执行权限
简单入门:
1.创建一个后缀名为.sh的文件。(当然后缀名并不是一定要是这个的,.sh是为了让用户清楚的知道这是一个脚本文件)
[zhihua@localhost day1]$ vim helloworld.sh
2.在helloworld.sh文件中编辑如下内容:
1 #!/usr/bash
2 echo "HelloWorld"
3.运行脚本文件
方法一(并不推荐):
[zhihua@localhost day1]$ sh ./helloworld.sh
方法二:更改脚本文件的权限为可执行。然后运行该文件即可
[zhihua@localhost day1]$ chmod 744 ./helloworld.sh
2.shell脚本的简单语法
1.系统变量与用户自定义变量的使用
2.设置环境变量
1.在某个文件中将某个变量导出为环境变量:export 变量名=变量值
2.让修改后的配置信息生效:source 配置文件
3.查询环境变量的值:echo $变量名
举例:
假设我们现在有一个配置文件ex.conf,然后我们在该文件中设置环境变量:
1 export MYSQL_BIN=/home/zhihua
2.让该配置生效:
[zhihua@localhost day1]$ source ./ex.conf
3.这样的话我们就可以在脚本文件中使用我们设置好的环境变量勒。
在example.sh这个脚本文件中使用在其他文件中设置好的环境变量:
31 #在使用该环境变量之前,需要命令source 配置文件名让配置信息生效
32 echo $MYSQL_BIN
3.位置参数变量的使用
当我们执行脚本时如果希望获取命令行的参数信息就可以使用位置参数变量。比如说./example.sh 100 200
这是一个执行脚本的命令行,那么可以在脚本文件中获取100,200这两个参数信息。
基本语法:
1.$n
:n为数字。$0
代表命令本身,$1
~$9
代表第一到第九个参数。如果需要表示第九以上的参数需要用大括号将数字括起来,比如说表示第十个参数:${10}
2.$*
:这个代表命令行中的所有参数,$*
将所有的参数看成一个整体。
3.$@
:这个也代表命令行中所有的参数,不过$@
将命令行中的每个参数区分对待。对于$*
和$@
的区别在for循环里可以体现。
4.$#
:代表命令行中的参数个数。
4.预定义变量的使用
5.shell中运算符的使用
6.shell中的判断语句
基本语法:
[ condition ],注意condition前后有空格
常用的判断条件:
1.两个整数的比较:
=:字符串比较
-lt:小于
-le:小于或者等于
-eq:等于
-gt:大于
-ge:大于或者等于
-ne:不等于
2.按照文件权限进行判断
-r:有读的权限
-w:有写的权限
-x:有执行的权限
3.按照文件类型进行判断
-f:文件存在并且是一个常规的文件
-e:文件存在
-d:文件存在并且是一个目录文件。
7.流程控制
1.if语句
2.case语句
3.for语句
4.while循环
8.read读取控制台输入
基本语法:read 选项 参数。
常用的选项有:
1.-t:指定读取值时的等待时间,如果没有在指定的时间内输入就不等待了。
2.-p:指定读取值时的提示符。p表示prompt,有提示的意思。
参数:参数就是指定读取值时的变量名
9.函数
1.系统函数
这里介绍常用的两个系统函数:
1.basename:返回完整路径/最后的部分,常用于获取文件名。basename string [suffix]:string表示一个完整路径,suffix为后缀,如果suffix指定的话,basename会将string中的suffix去掉。
2.dirname:返回完整路径最后/前面的部分,常用于返回路径部分。dirname 文件绝对路径。表示去除包含绝对路径的文件名部分(非目录部分),返回目录部分。
在sysFunc.sh脚本文件中编辑如下内容:
1 basename /home/zhihua/练习/day1/sysFunc.sh
2 basename /home/zhihua/练习/day1/sysFunc.sh .sh
3 dirname /home/zhihua/练习/day1/sysFunc.sh
运行结果如下:
[zhihua@localhost day1]$ sh sysFunc.sh
sysFunc.sh
sysFunc
/home/zhihua/练习/day1
2.用户自定义函数
语法:
function funcName ()
{
action;
[return int];
}
10.综合举例如下:
1.语法常识
1 #!/usr/bash
2 #Linux shell中的变量分为系统变量和用户自定义变量。一些
3 #系统变量比如说PATH,HOME.$符号表示引用某个变量的值。
4 echo "PATH=$PATH"
5 echo "usr=$HOME"
6 #用户自定义变量的定义,定义一个变量a(变量名一般为大写)规则有:
7 #1.等号两边不能使用空格。
8 #2.变量名由字母数字下划线组成,并且首字母只能是字母或者是下划线,
9 #不能是数字.
10 A=100
11 #自定义变量的使用
12 echo "A=$A"
13 #销毁某个自定义变量使用unset 变量名,表示撤销某个自定义变量
14 unset A
15 #a被销毁后就没有值了
16 echo "A=$a"
17 #shell中的静态变量(只读变量)的定义
18 readonly B=200
19 echo "B=$B"
20 #注意:静态变量是不能unset的,所以下面这句代码是错误的
21 #unset b
22
23 #将一个Linux终端中的命令的结果赋值给用户自定义变量可以这样:使用反引号将终端命令
24 #引起来。或者使用$符号。
25 C=`ls -la`
26 echo "C=$C"
27
28 D=$(ls -la);
29 echo "D=$D"
30
31 #在使用该环境变量之前,需要命令source 配置文件名让配置信息生效
32 echo $MYSQL_BIN
33
34 #shell中的位置参数变量的使用
35 echo "第一个参数:$1"
36 echo "第二个参数:$2"
37
38 echo $@
39 echo $*
40 echo "参数个数:$#"
41
42 #shell中的预定义变量的使用
43 echo "当前进程id:$$"
44
45 #shell中运算符的运用
46 #1.$((运算式))
47 echo $((100 + 200))
48 #2.$[运算式]
49 echo $[100+200]
50 #3.expr 运算式,注意如果表示乘号需要用转义符\,也就是\*表示乘号。
51 #注意运算符与操作数之间需要空格,否则会报错。
52 expr 100 + 200
53 expr 100 \* 200
54
55 #shell中的判断语句
56 #案例1:判断“OK”是否等于“OK”
57 if [ "OKa" = "OK" ]
58 then
59 echo "equals"
60 fi
61 echo "not equals"
62 #2.案例二:判断/home/zhihua/practice/day1下是否存在example.txt文件
63 if [ -e /home/zhihua/练习/day1/example.txt ]
64 then echo "exits"
65 fi
66
67 #shell中的if语句
68 if [ $1 -ge 60 ]
69 then
70 echo "及格"
71 elif [ $1 -lt 60 ]
72 then
73 echo "不及格"
74 fi
75
76 #shell中的case语句
77 case $1 in
78 "1")
79 echo "周一"
80 ;;
81 "2")
82 echo "周二"
83 ;;
84 "3")
85 echo "other"
86 ;;
87 esac
88
89 #shell中的for循环
90 #for循环语法一:
91 #案例一:打印出命令行下给出的所有参数,注意$*与$@区别
92 for i in "$*"
93 do
94 echo "the num is $i"
95 done
96
97 for j in "$@"
98 do
99 echo "the num is $j"
100 done
101 #for循环语法二:
102 SUM=0
103 for((i=1 ; i<=100 ; i++))
104 do
105 SUM=$[$SUM+$i]
106 done
107 echo "SUM=$SUM"
108
109 #shell中的while循环
110 #案例:命令行中给定n的值,然后统计1+2+。。。+n的值
111 SUM1=0
112 i=0
113 while [ $i -le $1 ]
114 do
115 SUM1=$[$SUM1+$i]
116 i=$[$i+1]
117 done
118 echo "SUM1=$SUM1"
119
120 #shell中的read函数读取控制台的输入
121 #案例:读取控制台输入一个num1值,读取控制台输入一个num2值,在10秒内输入
122 read -p "请输入一个数:" NUM1
123 echo "num1=$NUM1"
124 read -t 10 -p "请输入一个数:" NUM2
125 echo "num2=$NUM2"
126
127 #shell中用户自定义函数的定义和使用
128 function add()
129 {
130 sum2=$[$a+$b]
131 echo "sum2=$sum2"
132 }
133
134 read -p "请输入第一个操作数:" a
135 read -p "请输入第二个操作数" b
136
137 add $a $b
2.编写一个脚本文件实现简单的加减乘除运算。
方法一:
1 #!/bin/bash
2 ARGUNUM=$#
3 if [ $ARGUNUM -gt 0 ]
4 then
5 NUM1=$1
6 NUM2=$2
7 NUM3=$3
8
9 case $2 in
10 "+")
11 echo $[$1+$3]
12 ;;
13 "-")
14 echo $[$1-$3]
15 ;;
16 #这里我们以.表示乘号
17 ".")
18 echo $[$1*$3]
19 ;;
20 "/")
21 echo $[$1/$3]
22 ;;
23 esac
24 fi
25
26 #注意:判断语句中的表达式前后需要有空格
27 if [ $ARGUNUM -eq 0 ]
28 then
29 echo "failed,no arguments"
30 fi
方法二:
1 #!/bin/bash
2 read -p "" NUM1 NUM2 NUM3
3 echo "$NUM1 $NUM2 $NUM3"
4 case $NUM2 in
5 "+")
6 echo $[$NUM1+$NUM3]
7 ;;
8 "-")
9 echo $[$NUM1-$NUM3]
10 ;;
11 ".")
12 echo $[$NUM1*$NUM3]
13 ;;
14 "/")
15 echo $[$NUM1/$NUM3]
16 ;;
17 esac
3.完成数据库的定时备份
#!/bin/bash
#完成数据库的定时备份。
#备份的路径
BACKUP=/data/backup/db
#当前的时间作为文件名
DATETIME=$(date +%Y_%m_%d_%H%M%S)
#可以输出变量调试
#echo ${DATETIME}
echo "=======开始备份========"
echo "=======备份的路径是 $BACKUP/$DATETIME.tar.gz"
#主机
HOST=localhost
#用户名
DB_USER=root
#密码
DB_PWD=root
#备份数据库名
DATABASE=atguiguDB
#创建备份的路径
#如果备份的路径文件夹存在,就使用,否则就创建
[ ! -d "$BACKUP/$DATETIME" ] && mkdir -p "$BACKUP/$DATETIME"
#执行mysql的备份数据库的指令
mysqldump -u${DB_USER} -p${DB_PWD} --host=$HOST $DATABASE | gzip > $BACKUP/$DATETIME/$DATETIME.sql.gz
#打包备份文件
cd $BACKUP
tar -zcvf $DATETIME.tar.gz $DATETIME
#删除临时目录
rm -rf $BACKUP/$DATETIME
#删除10天前的备份文件
find $BACKUP -mtime +10 -name "*.tar.gz" -exec rm -rf {} \;
echo "=====备份文件成功==========="
然后根据需求将这个脚本输入到任务调度文件中。