1、什么是Shell?
shell 由C语言编写的程序,它是用户使用Linux的桥梁。Shell既是一种命令语言,又是一个程序设计语言。
Shell是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核服务。
Shell 脚本
Shell 脚本(shell script),是一种为 shell 编写的脚本程序。
一般我们说的Shell是指shell脚本。
Unix系统中常见的shell有:sh、csh、ksh、tcsh、bash。
2、基本常识
shell脚本必须以 #!/bin/bash 开头。
以#开通的行表示注释,会被解释器忽略。
例如:test.sh
#!/bin/bash
for i in 1 2 3 4 5
do
echo "The value is :$i"
done
执行:
chmod +x test.sh #使该脚本具有执行权限
./test.sh #执行脚本
/bin/sh test.sh # 或者,作为解释器参数执行
3、常见语法
变量的定义与赋值
规范
- 首字母必须为字母
- 中间不能有空格
- 不能使用标点符号
- 不能使用bash里的关键字
赋值
变量没有默认值,所有必须在定义是赋初始值。
#!/bin/bash
MYNAME=Metre
echo ${MYNAME}
注意:等号前后不能有空格。
向Shell传参数
$数字: 表示第几个参数(0,表示执行的文件名)。
为脚本设置可执行权限,并执行脚本,输出结果如下所示:
$ chmod +x test.sh
$ ./test.sh 1 2 3
Shell 传递参数实例!
执行的文件名:./test.sh
第一个参数为:1
第二个参数为:2
第三个参数为:3
另外,还有几个特殊字符用来处理参数:
参数处理 | 说明 |
---|---|
$# | 传到脚本的参数个数 |
$* | 以字符串的方式传递所有参数到脚本 |
$$ | 脚本运行的当前进程ID |
$! | 后台运行的最后一个进程ID |
$@ | 与$*相同,但是使用时加引号,并在引号中返回每个参数。 |
$- | 显示Shell使用的当前选项,与set命令功能相同。 |
$? | 显示最后命令的推出状态。0表示没有错误,其他任何值表明有错误。 |
运算符
运算符之间一定要有空格,例如 1+1 是错的。必须写成 1 + 1 。
关系运算符
运算符 | 说明 |
---|---|
-eq | 检测两个数是否相等,相等返回true 例如: if [ $a -eq xx ] |
-ne | 检测两个数是否相等,不相等返回true |
-gt | 检测左边的数是否大于右边的数,如果是,返回true |
-lt | 检测左边的数是否小于右边的数,如果是,返回true |
-ge | 检测左边的数是否大于等于右边的数,如果是,返回true |
-le | 检测左边的数是否小于等于右边的数,如果是,返回true |
布尔运算符
运算符 | 说明 |
---|---|
&& | 逻辑与 |
两竖 | 逻辑或 |
字符串运算符
运算符 | 说明 |
---|---|
= | 检测两个字符串是否相等,相等返回true |
!= | 检测两个字符串是否相等,不相等返回true |
-z | 检测字符串长度是否为0,为0返回true |
-n | 检测字符串长度是否为0,不为0返回true |
str | 检测字符串是否为空,不为空返回true 。例如 :n=“abc” if[$a] 返回true |
流程控制
if语句 和 for循环 和 while 循环。
#!/bin/bash
a=2 #变量
b=2 #变量
#if语句
if [ $a == $b ] #注意空格 if 和 [ 和 $a 和 == 之间都必须有空格。
then
echo "a 等于 b"
elif [ $a -lt $b ]
then
echo "a 小于 b"
else
echo "a 大于 b"
fi #fi结束
for i in 1 6 7 8 # for循环
do
echo "for1 The value is:${i}"
#加入判断
if [ ${i} == 7 ]
then
echo 'break'
break #跳出循环
fi
#加入判断
if [ ${i} -ge 6 ]
then
echo 'continue'
continue #跳过本次循环执行下一次。
fi
done
#循环的另外一种写法
for (( i=1;i<=2;i++ ))
do
echo "for2 ${i}"
done
#while循环。
index=0
while(($index <=3))
do
echo "while ${index}"
let "index++"
done
执行结果:
a 等于 b
for1 The value is:1
for1 The value is:6
continue
for1 The value is:7
break
for2 1
for2 2
while 0
while 1
while 2
while 3
无限循环:
while true
do
#执行业务
done
while :
do
#执行业务
done
变量引用
引用shell变量要用$符号,并加{},以防止歧义。
例如:
声明变量
声明变量时,不能有空格,必须要有默认值。
单引号和双引号
二者都可以标识字符串,不同的是,单引号只能表示字符串,而双引号可以引用变量或特殊函数。
命令代换
反引号`` 或者 $(),其中的内容,会以命令的方式执行。
[root@jcsrv-110 home]# echo `sldf`
bash: sldf: command not found
算数代换:$(())
[root@jcsrv-110 home]# SB=$((2+1))
[root@jcsrv-110 home]# echo ${SB}
3
[root@jcsrv-110 home]#
数组
ar=(a 1 3 b 4 s) #定义数组
i=1 #变量
ar[${i}]=abc # 重新赋值
echo "数下标${i}的值为:${ar[i]}" # 输出
文件测试运算符
file="/home/test.sh"
if [ -r $file ]
then
echo "文件可读"
else
echo "文件不可读"
fi
文件测试运算符用于检测 Unix 文件的各种属性。属性检测描述如下 :
操作符 | 说明 | 举例 |
---|---|---|
-b file | 检测文件是否是块设备文件,如果是,则返回 true。 | [ -b $file ] 返回 false。 |
-c file | 检测文件是否是字符设备文件,如果是,则返回 true。 | [ -c $file ] 返回 false。 |
-d file | 检测文件是否是目录,如果是,则返回 true。 | [ -d $file ] 返回 false。 |
-f file | 检测文件是否是普通文件(既不是目录,也不是设备文件),如果是,则返回 true。 | [ -f $file ] 返回 true。 |
-g file | 检测文件是否设置了 SGID 位,如果是,则返回 true。 | [ -g $file ] 返回 false。 |
-k file | 检测文件是否设置了粘着位(Sticky Bit),如果是,则返回 true。 | [ -k $file ] 返回 false。 |
-p file | 检测文件是否是有名管道,如果是,则返回 true。 | [ -p $file ] 返回 false。 |
-u file | 检测文件是否设置了 SUID 位,如果是,则返回 true。 | [ -u $file ] 返回 false。 |
-r file | 检测文件是否可读,如果是,则返回 true。 | [ -r $file ] 返回 true。 |
-w file | 检测文件是否可写,如果是,则返回 true。 | [ -w $file ] 返回 true。 |
-x file | 检测文件是否可执行,如果是,则返回 true。 | [ -x $file ] 返回 true。 |
-s file | 检测文件是否为空(文件大小是否大于0),不为空返回 true。 | [ -s $file ] 返回 true。 |
-e file | 检测文件(包括目录)是否存在,如果是,则返回 true。 | [ -e $file ] 返回 true。 |
函数定义:
[root@jcsrv-110 home]# vi funtest.sh
#!/bin/bash
funAddNum(){ #定义函数
echo "该函数对输入的两个数字进行相加运算...."
printf "请输入第一个数字:"
read anum #控制台输入
echo "请输入第二个数字:"
read bnum #控制台输入
echo "两个数字分别为 ${anum} 和 ${bnum}"
return $(($anum + $bnum))
}
funAddNum # 调用函数
echo "输入的两个数字之和为: $? " # $?获取函数返回。
输入结果:
[root@jcsrv-110 home]# ./funtest.sh
该函数对输入的两个数字进行相加运算....
请输入第一个数字:1
请输入第二个数字:
3
两个数字分别为 1 和 3
输入的两个数字之和为: 4
带参函数:
[root@jcsrv-110 home]# vi funParam.sh
#!/bin/bash
funByParam(){
echo "第一个参数: $1"
echo "第二个参数: $2"
echo "第五个参数: ${5}"
echo "参数总数为: $# 个"
echo "输入所有参数: $* "
}
funByParam 1 4 3 4 25 656 44 #传参调用.
输出结果:
[root@jcsrv-110 home]# ./funParam.sh
第一个参数: 1
第二个参数: 4
第五个参数: 25
参数总数为: 7 个
输入所有参数: 1 4 3 4 25 656 44