一、初识Shell
- shell是一段应用程序,是用户与操作系统交互的桥梁
- shell通常指shell脚本
- shell是弱类型语言,在定义变量时不需要指定变量的类型
二、Shell脚本规范
- shell是以
.sh
文件结尾的文件 - .sh文件的第一行是:
#!/bin/bash
- .sh的注释符号是:
#
- .sh运行方式
第一种方式:
sh [].sh
第二种方式:
chmod +x [].sh
./[].sh
三、Shell语法
3.1 变量
3.1.1 定义变量
格式:变量名=变量值
注意:
- 变量名与
=
、变量值与=
没有空格- 变量值有空格时,需加单引号或双引号
提示:
- 输出变量值:
格式:echo $[变量名]
- 释放变量值:
格式:unset [变量名]
1. 变量名
- 不能以数字开头,由字母、数字、下划线组成
- 不能是关键字
2. 单引号、双引号、反单引号
- 单引号
如果'变量值'中存在$变量名的话,将原样输出$变量名
- 双引号
如果"变量值"中存在$变量名的话,将输出变量名对应的变量值
提示:
- 在$前加上转义字符
\
,就可以原样输出
- 反单引号
变量存放的是命令
3.1.2 应用
- 输出当前所在的目录
#!/bin/bash
dir=`pwd`
echo $dir
- 统计/etc目录下的文件个数
#!/bin/bash
filenum=`ls -alh /etc |wc -l`
echo "运行结果:/etc目录下有$((filenum-3))个文件"
2-1. 统计任意目录下的文件个数
第一种方式:
read读入键盘输入的参数
vim test.sh
sh test.sh
提醒:
- 关键:
read -p "[提示内容]" [变量1] [变量2]...
如果变量值的个数大于变量名的个数,就会把多余的变量值赋值给最后一个变量
#!/bin/bash
read -p "请输入要查看的目录:" dir
filenum=`ls -alh $dir |wc -l`
echo "运行结果:$dir目录下有$((filenum-3))个文件"
第二种方式:
参数传递
名称 | 说明 |
---|---|
$n |
第n个参数 |
$0 |
文件名称 |
$@ |
显示所有参数 |
$# |
参数个数 |
vim test.sh
sh test.sh [目录路径]
#!/bin/bash
filenum=`ls -alh $1 |wc -l`
echo "运行结果:$1目录下有$((filenum-3))个文件"
3.2 重定向
把命令内容输入到文件中
3.2.1 正确的命令(1
)
- 覆盖
格式:[command] 1 >[filename]
eg:
ls -l 1>a.txt
- 追加
格式:[command] 1 >>[filename]
ls -l /tmp 1>>a.txt
3.2.2 错误的命令(2
)
- 覆盖
格式:[command] 2 >[filename]
eg:
cd hahaha 2>a.txt
- 追加
格式:[command] 2 >>[filename]
cd hahaha 2>>a.txt
3.3 基本运算
3.3.1 基本运算符
参阅:
- 变量 a 为 10,变量 b 为 20
基本运算符 | 说明 |
---|---|
算术运算符 | |
-eq |
检测两个数是否相等,相等返回 true eg: [ $a -eq $b ]
|
-ne |
检测两个数是否不相等,不相等返回 true eg: [ $a -ne $b ]
|
-gt |
检测左边的数是否大于右边的,如果是,则返回 true eg: [ $a -gt $b ]
|
-lt |
检测左边的数是否小于右边的,如果是,则返回 true eg: [ $a -lt $b ]
|
-ge |
检测左边的数是否大于等于右边的,如果是,则返回 true eg: [ $a -ge $b ]
|
-le |
检测左边的数是否小于等于右边的,如果是,则返回 true eg: [ $a -le $b ]
|
逻辑运算符 | |
与 |
&& eg: [[ $a -lt 100 && $b -gt 100 ]]
|
或 |
|| eg: [[ $a -lt 100 || $b -gt 100 ]]
|
布尔运算符 | |
与 |
-a eg: [ $a -lt 20 -a $b -gt 100 ]
|
或 |
-o eg: [ $a -lt 20 -o $b -gt 100 ]
|
非 |
! eg: [ ! false ]
|
字符串运算符 | |
== |
检测两个字符串是否相等,相等返回true eg: [ "$a" == "$b" ]
|
!= |
检测两个字符串是否相等,不相等返回true eg: [ "$a" != "$b" ]
|
-z |
检测字符串长度是否为0,为0返回 true eg: [ -z $a ]
|
-n |
检测字符串长度是否不为0,不为0返回 true eg: [ -n "$a" ]
|
$ |
检测字符串是否为空,不为空返回 true eg: [ $a ]
|
文件测试运算符 | |
-b file |
检测文件是否是块设备文件,如果是,则返回 true eg: [ -b $file ]
|
-c file |
检测文件是否是字符设备文件,如果是,则返回 true eg: [ -c $file ]
|
-d file |
检测文件是否存在且是目录,如果是,则返回true eg: [ -d $file ]
|
-e file |
检测文件(包括目录)是否存在,如果是,则返回 true eg: [ -e $file ]
|
-f file |
检测文件是否存在且是普通文件(既不是目录,也不是设备文件),如果是,则返回 true eg: [ -f $file ]
|
-s file |
检测文件是否为空(文件大小是否大于0),不为空返回 true eg: [ -s $file ]
|
-x file |
检测文件是否可执行,如果是,则返回 true eg: [ -x $file ]
|
- d、e、f都有判断是否存在
- d 判断文件名是否存在且为目录
- e 判断文件是否存在
- f 判断文件是否存在且为文件
-
test可省略中括号,没有test不可以省略中括号
eg:
if test -d /root
then
echo "/root是目录"
else
echo "/root不是目录"
fi
或
if [ -d /root ]
then
echo "/root是目录"
else
echo "/root不是目录"
fi
3.3.2 基本变量运算
-
加1
➢((i++))
➢((i+=1))
➢let i=i+1
➢i=$[$i+1]
➢i=$(($i+1))
-
加减
➢s=$(($s+$i))
➢s=$[$s+$i]
➢((s=$s+$i))
3.4 程序结构
3.4.1 分支结构
1. if...else分支
(1) 规范
格式:
if [ 条件 ]
then
语句
else
语句
fi
或
if [ 条件 ];then
语句
else
语句
fi
- 条件两边有空格
- 多个条件间有空格
- if后面要有空格
条件中如果存在变量,变量两边要有双引号
(2) 应用
- 判断任意目录是否为空
#!/bin/bash
dir=$1
if [ ! -d "$1" ];then
echo "error:文件路径不存在"
else
result=`ls -al $dir|wc -l`
if [ $result -eq 3 ];then
echo "$dir目录为空"
else
echo "$dir目录不为空"
fi
fi
或
#!/bin/bash
dir=$1
if test -d "$1" ;then
result=`ls -al $dir|wc -l`
if [ $result -eq 3 ];then
echo "$dir目录为空"
else
echo "$dir目录不为空"
fi
else
echo "error:文件路径不存在"
fi
参阅:
- 判断用户输入的用户名和密码是否为admin 123456,如果是的话,提示登陆成功,不是的话,则提示登陆失败
#!/bin/bash
if [ "$1" == "admin" -a "$2" == "123456" ];then
echo "登录成功"
else
echo "登陆失败"
fi
- 输入数字,判断是否大于0,如果大于0,则-1输出,否则+1输出
#!/bin/bash
if [ "$1" -gt 0 ];then
echo "$(($1-1))"
else
echo "$(($1+1))"
fi
2. if...elif...else分支
(1) 规范
格式:
if [ 条件 ];then
语句
elif [ 条件 ];then
语句
...
elif [ 条件 ];then
语句
else
语句
fi
(2) 应用
- 评判成绩:85-100优秀,60-84合格,0-59不合格
#!/bin/bash
read -p "Enter your score(0-100): " GRADE
if [ $GRADE -gt 100 ] || [ $GRADE -lt 0 ] ; then
echo "$GRADE is Error"
else
if [ $GRADE -ge 85 ] && [ $GRADE -le 100 ] ; then
echo "$GRADE is Excellent"
elif [ $GRADE -ge 70 ] && [ $GRADE -le 84 ] ; then
echo "$GRADE is Pass"
else
echo "$GRADE is Fail"
fi
fi
- 判断用户输入内容是否为空,为空则提示,不为空则判断是否为目录,不为目录则判断是否为文件,否则提示错误信息
#!/bin/bash
read -p "请输入信息:" message
if [ -z "$message" ];then
echo "error:未输入内容"
elif [ -d "$message" ];then
echo "输入内容是:目录"
elif [ -e "$message" ];then
echo "输入内容是:文件"
else
echo "error:输入内容错误"
fi
3. case分支
(1) 规范
格式:
case [$变量名] in
[值1])
语句;;
...
[值n])
语句;;
*)
语句;;
esac
-
;;
结束语句 -
*)
默认语句 - esac是case语句的结束
- 值可以是数字、字符串、区间等
(2) 应用
- 根据用户输入的字母,判断选择的产品
#!/bin/bash
read -p "请输入产品代号:" pro
case "$pro" in
A)
echo "笔记本";;
B)
echo "电饭煲";;
C)
echo "小台灯";;
*)
echo "笔记本";;
esac
- 请输入对客服的满意度,0-3不满意,4-6满意,7-9非常满意
#!/bin/bash
read -p "请做出评价:" comment
case "$comment" in
[0-3])
echo "不满意";;
[4-6])
echo "满意";;
[7=9])
echo "非常满意";;
*)
echo "满意";;
esac
3.4.2 循环结构
1. for循环
(1) 规范
格式:
for [变量名] in [列表]
do
语句
done
(2) 应用
- 输出0-10的数
#!/bin/bash
for i in 1 2 3 4 5 6 7 8 9 10
do
echo "$i"
done
seq
格式:step start size max
size为1可以省略
#!/bin/bash
for i in `seq 1 1 10`
do
echo "$i"
done
1. while循环
(1) 规范
格式:
while [ 条件 ]
do
语句
done
(2) 应用
- 求1-100的和
#!/bin/bash
sum=0
i=1
while [ "$i" -le 100 ]
do
sum=$(($sum+$i))
((i++))
done
echo "1-100的和:$sum"
3.4.3 函数
(1) 规范
格式:
- 定义函数
[函数名](){
语句
}
-
函数调用
函数先定义再调用
格式:
[函数名]
-
函数参数
$1
...$n
eg:
4+5
#!/bin/bash
add(){
echo "$1+$2=$(($1+$2))"
}
add 4 5
-
函数返回值
默认存在返回值
查看函数返回值:echo $?
,没有错误返回0,有错误返回1
#!/bin/bash
hello(){
echo "Hello World!!!"
}
hello
echo $?
(2) 应用
更新中......
网友评论