shell介绍
shell是一段应用程序,是用户和操作系统交互的桥梁,它是弱类型语言,不需要指定变量的类型
shell脚本是以sh结尾的文件
sh文件的第一行内容为#!/bin/bash,表示使用shell进行编程
shell注释:#
shell语法
变量
变量名=变量值,等于号两边不能有空格
变量名规范
不能以数字开头,字母、数字、下划线组成
输出变量内容echo $变量名
变量的释放 unset 变量名
特殊的变量
带有空格的变量定义
双引号如果变量值存在
变
量
名
的
话
,
那
么
输
出
结
果
就
是
变
量
名
对
应
的
变
量
值
,
如
果
要
原
样
输
出
内
容
,
可
以
在
变量名的话,那么输出结果就是变量名对应的变量值,如果要原样输出内容,可以在
变量名的话,那么输出结果就是变量名对应的变量值,如果要原样输出内容,可以在变量名前面添加转义字符
单引号 如果变量值中存在$变量名,那么原样输出
反单引号`` 存放的是命令
使用shell脚本,输出当前目录
新建.sh文件 例如建一个名为script的shell文件
vi script.sh
在文件中编写脚本
执行
sh 文件名.sh
添加x权限:chnod +x 文件名.sh
sh script.sh
或
chnod +x script.sh
执行./文件名.sh
./script.sh
计算/etc目录下有多少个文件
#!/bin/bash
#进入etc目录下
cd /etc
filename="ls -l|wc -l"
echo "该目录下有$filename个文件"
统计任何指定目录下的文件个数
通过键盘输入 read 变量名 变量名可以一个或多个,变量名用空格隔开,变量值用空格隔开 如果变量值多于变量名,那么会把多余的变量值赋给最后一个变量 可以添加提示信息:read -p"提示内容" 变量名
read a
chen
echo $a
read a b
aaa bbb
echo $a
echo $b
#!/bin/bash
#输入目录
read dir
read -p "请输入目录:" dir
#进入etc目录下
cd $dir
cd /etc
filename="ls -l|wc -l"
echo "该目录下有$filename个文件"
运行
sh script.sh
/etc
/tmp
参数传递
$0这是该文件的名称
$1这是第一个参数
$2这是第二个参数
···
$@这是显示所有参数
$#这是显示参数个数
重定向
正确的命令
覆盖:命令1>文件名 如:ls 1>a.txt
追加:命令1>>文件名 如:ls /tmp 1>>a.txt
错误的命令
覆盖:命令2>文件名 如:ls 2>a.txt
追加:命令2>>文件名 如:ls /tmp 2>>a.txt
程序的结构
分支结构if else
if [ 条件 ]
then
语句
else
语句
fi
注意:1.条件两边要有空格,2.多个条件间存在空格,3.if后面要有空格,4.条件中如果存在变量,那么变量两边要有双引号如:name=“chengliang” —>echo $name N=“chenliang”
练习:判断根目录/root是否为空
ls /root
字符串的比较:==判断是否相等,!=判断是否不相等
vi script.sh
应用一:
#!/bin/bash
dir=' ls /root '
if [ "$dir" == "" ]
then
echo "目录为空"
else
echo "目录不为空"
fi
应用二:
#!/bin/bash
dir=' ls /root '
if [ "$dir" == "" ]:then
echo "目录为空"
else
echo "目录不为空"
fi
任意目录:
#!/bin/bash
read -p "请输入目录:" dir
d='ls $dir'
if [ "$d" == "" ]:then
echo "目录为空"
else
echo "目录不为空"
fi
练习:通过用户输入的用户名和密码是否为admin 123456,如果是则提示登录成功,否则提示失败
逻辑运算符:且-a,或者-o,非!
#!/bin/dash
#提示用户输入用户名和密码
read -p '请输入用户名和密码:' username password
#进行判断
if [ "$username" == "admin" -a "$password" == "123456" ]
then
echo "登录成功"
else
echo "登录失败"
fi
练习:输入数字,判断是否大于0,如果大于0则将该数字-1输出,否则+1输出
比较运算符
-eq 判断是否相等
-ne 判断是否不相等
-gt 判断是否大于
-ge 判断是否大于等于
-lt 判断是否小于
-le 判断是否小于等于
数字变量操作:
((i++))
((i+=1))
i=$[$i+1]
let i=i+1
i=$(($i+1))
例:
#!/bin/bash
#输入数字
read -p "please input a number" num
#判断
if [ '$num' -gt 0 ]
then
((num--))
echo $num
else
((num++))
echo $num
fi
练习:判断用户输入的目录是否存在,如果存在则统计目录下的文件个数,否则提示用户该目录不存在
test 参数 变量名
-e表示文件是否存在
-f表示文件是否存在且为文件
-d表示文件名是否存在且为目录
-r可读
-w可写
-x可执行
-n字符串长度是否不等于0
-z字符串长度是否等于0
例:
#!/bin/bash
#提示用户输入
read -p "请输入一个目录" dir
#进行判断
if test -d $dir
then
#统计文件个数
filenum=' ls -l $dir|wc -l'
echo "目录$dir下的文件个数为$filenum"
else
echo "目录不存在"
fi
if…elif…else分支
if [ 条件 ]
then
语句
elif [ 条件 ]
then
语句
elif [ 条件 ]
then
语句
else
语句
fi
练习:判断学生成绩,90-100提示优秀,80-90提示良好,70-80提示一般,60-70提示及格,其他提示不及格
#!/bin/bash
#提示用户输入分数
read -p "请输入一个成绩:" score
if [ '$score' -ge 90 -a '$score' -le 100 ]
then
echo "优秀"
elif [ '$score' -ge 80 -a '$score' -lt 90 ]
then
echo "良好"
elif [ '$score' -ge 70 -a '$score' -lt 80 ]
then
echo "一般"
elif [ '$score' -ge 60 -a '$score' -lt 70 ]
then
echo "及格"
else
echo "不及格"
fi
判断文件
#!/bin/bash
#提示用户输入
read -p "请输入内容" con
if [ -z "$con" ]
then
echo "为空"
elif [ -d "$con" ]
then
echo "是目录"
elif [-f "$con"]
then
echo "是文件"
else
echo "错误"
fi
case分支
case $变量名 in
"值")
语句;;
"值")
语句;;
"值")
语句;;
...
*)
语句;;
esac
注意:
1.case 这一行最后必须为in
2.;;结束语句
3.*默认
4.esac case语句的结束
5."值"可以是数字/字符串
6."值"的区间范围为[0-9]
例子:
#!/bin/bash
#提示
read -p "请输入产品" pro
case $pro in
"A")
echo "笔记本";;
"B")
echo "hahh";;
"C")
echo "112245";;
esac
#!/bin/bash
#提示
read -p "请输入评判" pj
case $pj in
[0-3])
echo "不满意";;
[4-6])
echo "满意";;
[7-9])
echo "非常满意";;
esac
循环结构
for循环
for 变量名 in 列表
do
语句
done
练习:输出1-10的数
#!/bin/bash
#循环
for i in 1 2 3 4 5 6 7 8 9 10
do
echo $i
done
改进
seq start size max
size的值为1可以省略
start 开始点
size 间隔
max 结束点
#!/bin/bash
#循环
for i in 'seq 1 1 10'
do
echo $i
done