文件类型为.sh,可以用vi编辑器打开,在开头加入注释#!/bin/bash告诉系统该shell脚本使用bash解释
变量
变量名定义时要注意:
使用一个定义过的变量,只需要在变量名前加$符号即可,变量前需要一个空格,例如(【】内是一个完整的变量)
【 ${变量名}】
变量名外的花括号是可选的,加不加均可,花括号的目的在于帮助解释器识别变量的边界,例如
for skill in Ada Coffe Action Java; do
echo "I am good at ${skill}Script"
done
如果不给skill变量加花括号,写成
echo "I am good at $skillScript"
解释器这回把$skillScript当成一个变量(值为空),代码执行的结果就和我们所期望的不一致了
下面是我写的一个脚本文件
[hadoop@master test]$ vi test01.sh
#!bin/bash
a=10
b=20
c=10
echo "a=10,b=20,c=10"
echo "a -eq b等于为真"
[ $a -eq $b ];echo $?
echo "a -eq c "
[ $a -eq $c ];echo $?
echo "a -ne b不等于为真"
[ $a -ne $b ];echo $?
echo "a -gt c大于为真"
[ $a -gt $c ];echo $?
echo "a -ge c大于等于为真"
[ $a -ge $c ];echo $?
错误点总结:
执行结果:
[hadoop@master test]$ bash test01.sh
a=10,b=20,c=10
a -eq b等于为真
1
a -eq c
0
a -ne b不等于为真
0
a -gt c大于为真
1
a -ge c大于等于为真
0
-z 字串 字串长度为null则为真
[ -z $c ] ; echo $?
-n 字串 字串长度不为null则为真
测试
[hadoop@master test]$ ll
total 12
-rwxrwxr-x 1 hadoop hadoop 61 Jul 20 09:02 shellTest.sh
-rw-rw-r-- 1 hadoop hadoop 299 Jul 20 11:48 test01.sh
-rw-rw-r-- 1 hadoop hadoop 13 Jul 19 14:10 test.txt
[hadoop@master test]$ [ -x test01.sh ];echo $?
1
[hadoop@master test]$ [ -x shellTest.sh ];echo $?
0
[hadoop@master test]$ [ -c shellTest.sh ];echo $?
1
[hadoop@master test]$ [ -f shellTest.sh ];echo $?
0
[hadoop@master test]$ [ -b shellTest.sh ];echo $?
1
[hadoop@master test]$ [ -d shellTest.sh ];echo $?
1
[hadoop@master test]$ [ -s shellTest.sh ];echo $?
0
for i in (xx)
do
循环体……
done
[hadoop@master test]$ vi test02.sh
#!bin/bash
#使用for循环打印1-10
for i in 1 2 3 4 5 6 7 8 9 10
do
echo $i
done
"test02.sh" [New] 6L, 86C written
[hadoop@master test]$ bash test02.sh
1
2
3
4
5
6
7
8
9
10
for((条件判断))
do
循环体……
done
[hadoop@master test]$ vi test03.sh
#!bin/bash
for((i=1;i<11;i++))
do
echo $i
done
"test03.sh" 5L, 47C written
[hadoop@master test]$ bash test03.sh
1
2
3
4
5
6
7
8
9
10
这里说一个注意到的关于权限的问题
没有x(执行)权限的sh脚本,可以用bash 文件名执行,但不可以用./ 文件名执行
但是赋予了x权限后,便可以用./ 文件名的方式执行了
再举一个for循环的应用
打印九九乘法表
[hadoop@master test]$ vi test04.sh
#!bin/bash
#打印乘法表
for ((i=1;i<10;i++))
do
for ((j=1;j<=i;j++))
do
echo -ne "$i*$j=$((i*j))\t"
done
echo " "
done
"test04.sh" 11L, 124C written
[hadoop@master test]$ bash test04.sh
1*1=1
2*1=2 2*2=4
3*1=3 3*2=6 3*3=9
4*1=4 4*2=8 4*3=12 4*4=16
5*1=5 5*2=10 5*3=15 5*4=20 5*5=25
6*1=6 6*2=12 6*3=18 6*4=24 6*5=30 6*6=36
7*1=7 7*2=14 7*3=21 7*4=28 7*5=35 7*6=42 7*7=49
8*1=8 8*2=16 8*3=24 8*4=32 8*5=40 8*6=48 8*7=56 8*8=64
9*1=9 9*2=18 9*3=27 9*4=36 9*5=45 9*6=54 9*7=63 9*8=72 9*9=81
其中循环语句
echo -ne "$i*$j=$((i*j))\t"
等同于
echo -n -e "$i*$j=$((i*j))\t"
这里的-ne不是计算中不等于的意思,而是echo的参数
-e 每次遇到\t时转义
-n 每次的输出不换行
while [ 条件 ]
do
命令序列
done
[hadoop@master test]$ vi test05.sh
#!bin/bash
count=1
while [ $count -le 10 ]
do
echo $count
count=$((count+1))
done
echo $?
"test05.sh" 8L, 93C written
[hadoop@master test]$ bash test05.sh
1
2
3
4
5
6
7
8
9
10
0
while read line
do
命令序列
done
if condition
then
command1
command2
...
commandN
fi
获取输入:
read -p "打印内容" i(i为保存你输入内容的变量)
一个比大小的例子:
#!/bin/bash
read -p "please input the first:" a
read -p "please input the second:" b
if [ $a -eq $b ]
then
echo "="
elif [ $a -lt $b ]
then
echo "<"
elif [ $a -gt $b ]
then
echo ">"
fi
"test06.sh" [New] 14L, 211C written
[hadoop@master test]$ bash test06.sh
please input the first:4
please input the second:5
<
case 对象 in
引号表示对象的取值,加反括号表示结束,*号表示其他,类似default
每一个取值结束后用两个连续的分号分割,类似于java里switch的break;
[hadoop@master test]$ vi casetest.sh
#!/bin/bash
read -p "请输入[y|n]:" i
case $i in
"y")
echo "yes!"
;;
"n")
echo "no!"
;;
*)
echo "y or n!"
esac
"casetest.sh" [New] 12L, 114C written
[hadoop@master test]$ bash casetest.sh
请输入[y|n]:y
yes!
[hadoop@master test]$ bash casetest.sh
请输入[y|n]:n
no!
[hadoop@master test]$ bash casetest.sh
请输入[y|n]:s
y or n!
date 命令显示当前时间
date -s "2018-07-20 9:47:52" 用root权限修改临时时间,重启后会失效
#查看atd服务是否开启
[root@master test]# service atd status
atd (pid 1515) is running...
#停止服务
[root@master test]# service atd stop
Stopping atd: [ OK ]
[root@master test]# service atd status
atd is stopped
#启动服务
[root@master test]# service atd start
Starting atd: [ OK ]
[root@master test]# service atd status
atd (pid 2347) is running...
at [启动时间]
按ctrl+d结束
[hadoop@master test]$ at "9:58"
at> touch at.txt
[hadoop@master test]$ at -l
3 2018-07-20 09:58 a hadoop
参数:
-l 查看用户计划任务
-d 删除用户计划任务
-c 查看at计划任务的具体内容
crontab 周期性执行计划任务
用法
crontab [-u 用户] [-l|-r|-e]
参数:
-u:指定某个用户,不加-u选项则为当前用户
-e:制定计划任务
-l:列出计划任务
-r :删除计划任务
注意:也要先确定crond服务是否启动
设置格式
分(0-59) 时(00-23) 日(1-31) 月(1-12) 周(0-7) 命令
可以使用横杠(-)来表示一段连续的时间
使用(,)表示若干不连续的时间
使用星号(*)表示所有的时间
使用除号(/)表示间隔时间
每周日凌晨12:00将passwd文件拷贝到datas中
0 0 * * 7 cp /etc/passwd /opt/datas
每一分钟往at.txt中插入一个正字
[hadoop@master test]$ crontab -e
no crontab for hadoop - using an empty one
*/1 * * * * echo "正" >>at.txt
[hadoop@master test]$ crontab -l
*/1 * * * * echo "正" >>at.txt