--------------------------shell script部分------------------------
一、什么是shell
shell是c程序写一门脚本语言,它主要承担是用户和linux系统使用的桥梁。
shell编程指两方面,一个是对shell程序进行编程。一个是使用shell进行编程。
二、shell有那些解释器?
/bin/bash
/bin/sh
/bin/tcsh
/bin/ksh (需要安装)
由于bash是开源免费易用,所以linux默认的shell也是采用的bash
三、shell运行的环境、运行方式
第一种方式运行脚本:
vi test1.sh
echo "123456...."
执行:在执行的时候指定解释器
/bin/sh ./test1.sh
第二种方式执行shell脚本
可以在脚本文件的第一行指定解释器
vi test2.sh
#!/bin/sh
echo "the second way to run shell"
用这种方式执行脚本,必须给脚本添加可执行权限
chmod u+x ./test2.sh
执行:
./test2.sh
四、shell编程
(1).shell的变量定义和使用
变量名和等号之间不能有空格,这可能和你熟悉的所有编程语言都不一样。
同时,变量名的命名须遵循如下规则:
首个字符必须为字母(a-z,A-Z)。
中间不能有空格,可以使用下划线(_)。
不能使用标点符号。
不能使用bash里的关键字(可用help命令查看保留关键字)。
使用一个定义过的变量,只要在变量名前面加美元符号即可,
vi test3.sh
#!/bin/sh
name="laowang"
echo "$JAVA_HOME"
echo "$name"
输出的结果:
/home/hadoop/jdk1.7.0_79
laowang
变量的定义可以使用双引号和单引号
vi test4.sh
#!/bin/sh
name="laowang"
sex='gay'
echo '$JAVA_HOME'
echo '$name'
echo "$sex"
输出的结果:
$JAVA_HOME
$name
gay
所以:
单引号字符串的限制:
(1).单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的;
(2).单引号字串中不能出现单引号(对单引号使用转义符后也不行)
双引号的优点:
(1).双引号里可以有变量
(2).双引号里可以出现转义字符
只读变量:readonly
age=10
readonly age
age=20 #执行时报错,提示不能修改
echo "$age"
删除变量: unset
age=10
unset age
echo "$age" #没有结果
拼接字符串
name1="laoli"
echo "hi,$name1"
输出结果:
hi,laoli
获取字符串长度
name1="laoli"
echo "${#name1}"
提取子字符串
name1="laoli"
echo "${name1:1:2}" #从下标为1开始,长度2
输出的结果:
ao
(2).shell的数组
素组定义:
arr_name=("laowang" "xiaowang" "xiaoxiaowang")
或者
arr_name=(
"laowang"
"xiaowang"
"xiaoxiaowang"
)
获取某一个元素:
element1=${arr_name[0]}(注意不能$arr_name[0])
echo "$element1"
获取素组的长度
len=${#arr_name[*]}(可以这么写#arr_name[@])
echo "$len"
(3).shell运算符操作
1)算数运算符
原生bash不支持简单的数学运算,但是可以通过其他命令来实现,
例如 awk 和 expr,expr 最常用。
expr 是一款表达式计算工具,使用它能完成表达式的求值操作。
+ 加法 `expr $a + $b` 结果为 30。
- 减法 `expr $a - $b` 结果为 -10。
* 乘法 `expr $a \* $b` 结果为 200。
/ 除法 `expr $b / $a` 结果为 2。
% 取余 `expr $b % $a` 结果为 0。
= 赋值 a=$b 将把变量 b 的值赋给 a。
== 相等。用于比较两个数字,相同则返回 true。 [ $a == $b ] 返回 false。
!= 不相等。用于比较两个数字,不相同则返回 true。 [ $a != $b ] 返回 true。
vi test7.sh
#!/bin/sh
a=10
b=20
c1=`expr $a - $b`
c2=`expr $a + $b`
c3=`expr $a \* $b`
c4=`expr $a / $b`
echo "$a - $b => $c1"
echo "$a + $b => $c2"
echo "$a \* $b => $c3"
echo "$a / $b => $c4"
2)关系运算符
-eq : equal 检测两个数是否相等,相等返回 true。 [ $a -eq $b ] 返回 false。
-ne : not equal 检测两个数是否相等,不相等返回 true。 [ $a -ne $b ] 返回 true。
-gt : greater than 检测左边的数是否大于右边的,如果是,则返回 true。 [ $a -gt $b ] 返回 false。
-lt : less than 检测左边的数是否小于右边的,如果是,则返回 true。 [ $a -lt $b ] 返回 true。
-ge : greater equal 检测左边的数是否大于等于右边的,如果是,则返回 true。 [ $a -ge $b ] 返回 false。
-le : less than 检测左边的数是否小于等于右边的,如果是,则返回 true。 [ $a -le $b ] 返回 true。
案例:
vi test8.sh
#!/bin/sh
a=$1
b=$2
if [ $a -eq $b ]
then
echo "$a -eq $b : a 等于 b"
else
echo "$a -eq $b: a 不等于 b"
fi
if [ $a -ne $b ]
then
echo "$a -ne $b: a 不等于 b"
else
echo "$a -ne $b : a 等于 b"
fi
if [ $a -gt $b ]
then
echo "$a -gt $b: a 大于 b"
else
echo "$a -gt $b: a 不大于 b"
fi
if [ $a -lt $b ]
then
echo "$a -lt $b: a 小于 b"
else
echo "$a -lt $b: a 不小于 b"
fi
if [ $a -ge $b ]
then
echo "$a -ge $b: a 大于或等于 b"
else
echo "$a -ge $b: a 小于 b"
fi
if [ $a -le $b ]
then
echo "$a -le $b: a 小于或等于 b"
else
echo "$a -le $b: a 大于 b"
fi
运行:./test8.sh 100 200
100 -eq 200: a 不等于 b
100 -ne 200: a 不等于 b
100 -gt 200: a 不大于 b
100 -lt 200: a 小于 b
100 -ge 200: a 小于 b
100 -le 200: a 小于或等于 b
3)布尔运算符
! 非运算,表达式为 true 则返回 false,否则返回 true。 [ ! false ] 返回 true。
-o (or)或运算,有一个表达式为 true 则返回 true。 [ $a -lt 20 -o $b -gt 100 ] 返回 true。
-a (and)与运算,两个表达式都为 true 才返回 true。 [ $a -lt 20 -a $b -gt 100 ] 返回 false。
#!/bin/sh
a=$1
b=$2
if [ $a != $b ]
then
echo "$a != $b : a 不等于 b"
else
echo "$a != $b: a 等于 b"
fi
if [ $a -lt 100 -a $b -gt 15 ]
then
echo "$a 小于 100 且 $b 大于 15 : 返回 true"
else
echo "$a 小于 100 且 $b 大于 15 : 返回 false"
fi
if [ $a -lt 100 -o $b -gt 100 ]
then
echo "$a 小于 100 或 $b 大于 100 : 返回 true"
else
echo "$a 小于 100 或 $b 大于 100 : 返回 false"
fi
if [ $a -lt 5 -o $b -gt 100 ]
then
echo "$a 小于 5 或 $b 大于 100 : 返回 true"
else
echo "$a 小于 5 或 $b 大于 100 : 返回 false"
fi
运行:./test9.sh 10 20
4)字符串运算符
定变量 a 为 "abc",变量 b 为 "efg":
a=abc
b=efg
= 检测两个字符串是否相等,相等返回 true。 [ $a = $b ] 返回 false。
!= 检测两个字符串是否相等,不相等返回 true。 [ $a != $b ] 返回 true。
-z 检测字符串长度是否为0,为0返回 true。 [ -z $a ] 返回 false。
-n 检测字符串长度是否为0,不为0返回 true。 [ -n $a ] 返回 true。
str 检测字符串是否为空,不为空返回 true。 [ $a ] 返回 true。
vi test.10.sh
a="abcd"
b="werf"
if [ $a = $b ]
then
echo "$a = $b : a 等于 b"
else
echo "$a = $b: a 不等于 b"
fi
if [ $a != $b ]
then
echo "$a != $b : a 不等于 b"
else
echo "$a != $b: a 等于 b"
fi
if [ -z $a ]
then
echo "-z $a : 字符串长度为 0"
else
echo "-z $a : 字符串长度不为 0"
fi
if [ -n $a ]
then
echo "-n $a : 字符串长度不为 0"
else
echo "-n $a : 字符串长度为 0"
fi
if [ $a ]
then
echo "$a : 字符串不为空"
else
echo "$a : 字符串为空"
fi
5)文件测试运算符
-d 检测文件是否是目录,如果是,则返回 true。
-f 检测文件是否是普通文件(既不是目录,也不是设备文件),如果是,则返回 true。
-s 检测文件是否为空(文件大小是否大于0),不为空返回 true。
-e 检测文件(包括目录)是否存在,如果是,则返回 true
案例:
#!/bin/sh
path=/home/hadoop/shell/newfile
if [ -d $path ];then
echo "$path is a directory"
fi
if [ -f $path ] #判断是否为文件
then
echo "$path is a file"
if [ -s $path ] #判断文件是否为空
then
echo "$path is not empty"
fi
fi
if [ -e $path ];then
echo "the path exists!"
else
echo "the path not exists!"
fi
(4).shell的条件判断
if [ $a -eq $b ]
then
echo " ......"
fi
if [ $a -eq $b ]
then
echo " ......"
else
echo " ++++++"
fi
if [ $a -eq $b ]
then
echo "-eq"
elif [ $a -gt $b ]
then
echo " -gt "
else
echo " other "
fi
(5).shell for/while循环
vi test12.sh
#!/bin/sh
for i in 1 2 3 4 5
do
echo $i
done
vi test13.sh
#!/bin/sh
for i in `seq 1 5`
do
echo $i
done
vi test14.sh
#!/bin/sh
for((i=1;i<=5;i++))
do
echo $i
done
常用的案例效果: 输出当前路径下所有文件夹的路径
vi test15.sh
!/bin/sh
path=`pwd`
echo "$path"
for file in `ls ./`
do
if [ -d $path/$file ];then
echo $path/$file
fi
done
while 判断:
vi test16.sh
#!/bin/sh
i=1
while(($i<=5))
do
echo "$i"
# let "i++"
i=`expr $i + 1`
done
(6).shell的方法定义
(7).shell时间
五、综合案例
1、删除当前目录下大小为0的文件
2、给某个文件夹下所有文件问好
3、列出某个路径下所以文件的路径(非文件夹)
4、判断hdfs文件是否存在