一、规范
- Shell脚本是以.sh结尾的文件;
- sh 文件的第一行内容为 #!/bin/bash,它告诉系统使用(Bourne Again Shell)解释器来执行;
- shell 中的注释:# ;
- shell 文件的执行有两种方式:
- sh 文件名.sh;
- 添加可执行权限:chmod +x 文件名.sh ,再进入文件所在目录,执行 ./文件名.sh;
二、变量
- 变量名=变量值:等于号两边不能有空格;
- 变量命名规范:不能以数字开头,可以由字母、数字、下划线组成;
- 输出变量内容:echo $变量名;
- 变量的释放:unset 变量名;
- 特殊的变量,带有空格的变量定义
- 双引号"":如果变量值中存在 $变量名 的话,那么输出结果将会是变量名对应的变量值。如果想原样输出内容,可以在 $变量名 前面加转义字符 “”;
- 单引号'':如果变量值中存在 $变量名,那么将原样输出;
- 反单引号``:存放的是命令;
练习:
#!bin/bash dir=`pwd` echo "当前所在的目录是:$dir"
#!bin/bash # 进入/etc目录下 cd /etc # 计算文件个数 num=`ls -al|wc -l` # 输出 echo "/etc下文件个数为:$num"
#!bin/bash read -p "请输入指定目录:" dir cd $dir # 计算文件个数 num=`ls -al|wc -l` # 输出 echo "$dir下文件个数为:$num"
read 用法
- 变量名可以有一个或者多个,变量名用空格隔开,变量值用空格隔开;
- 如果变量值多于变量名,那么将会把多余的变量值赋值给最后一个变量;
- 可以添加提示信息:read -p "提示的内容" 变量名;
三、参数传递
- 命令:文件名 参数,如:sh script.sh /etc;
- 文件中接收参数的方式
- $1---> 表示第一个参数;
- $2---> 表示第二个参数;
- $n---> 表示第n个参数;
- $0---> 代表文件名;
- $@--> 显示全部参数;
- $#--> 显示参数的个数;
练习:
#!/bin/bash echo "这个数据是$1" echo "这个数据是$2" echo "这是$0" echo "这是$@" echo "这是$#"
结果:
四、重定向
把命令的结果输出到文件中
- 正确的命令:用 1 表示
- 覆盖:命令 1>文件名,如:ls 1>a.txt;
- 追加:命令 1>>文件名,如:ls /tmp 1>>a.txt;
- 错误的命令:用 2 表示
- 覆盖:命令 2>文件名,如:ls 2>a.txt;
- 追加:命令 2>>文件名,如:ls /tmp 2>>a.txt;
五、条件判断
1、if...else
if [ 条件 ] then 语句 else 语句 fi ##################### if [ 条件 ];then 语句 else 语句 fi
- if 后面要有空格
- 中括号内条件两边要有空格
- 多个条件间要有空格
- 条件中如果存在变量,那么变量的两边要有双引号,如:if [ "$dir" == "" ]
练习:
#!/bin/bash dir=/root command=`ls $dir` if [ "$command" == "" ];then echo "目录为空" else echo "目录不为空" fi
#!/bin/bash read -p "请输入目标目录:" dir command=`ls $dir` if [ "$command" == "" ];then echo "目录为空" else echo "目录不为空" fi
- 字符串比较
- ==:判断是否相等
- !=:判断是否不相等
#!/bin/bash read -p "请输入用户名和密码:" username password if [ "$username" == "admin" -a "$password" == "123456" ];then echo "用户名和密码正确" else echo "用户名或密码不正确" fi
- 逻辑运算符:
- 或:-o
- 与:-a
- 非:!
#!/bin/bash read -p "请输入一个数字:" num if [ "$num" -gt 0 ] then ((num++)) echo $num else ((num--)) echo $num fi
- 比较运算符(数字)
- -eq ---> 判断是否相等
- -ne ---> 判断是否不相等
- -gt ----> 判断是否大于
- -ge ---> 判断是否大于等于
- -lt ----> 判断是否小于
- -le ----> 判断是否小于等于
- 数字变量操作
- 递增
- ((i++))
- ((i+=1))
- i=$[$i+1]
- let i=i+1
- i=$(($i+1))
- 递减也是一样有上面5中方式
- 递增
#!/bin/bash read -p "请输入对应的目录:" dir if test -d $dir then num=`ls $dir|wc -l` echo "目录$dir下的文件个数为:$num" else echo "目录$dir不存在" fi
- 测试文件状态
- test 参数 变量名
- 参数
- -e:表示文件是否存在
- -f:表示文件是否存在且为文件
- -d:表示文件名是否存在且为目录
- -r:可读
- -w:可写
- -x:可执行
2、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" -gt 90 -a "$score" -lt 100 ] then echo "优秀" elif [ "$score" -gt 80 -a "$score" -lt 90 ] then echo "良好" elif [ "$score" -gt 70 -a "$score" -lt 80 ] then echo "一般" elif [ "$score" -gt 60 -a "$score" -lt 70 ] then echo "及格" else echo "不及格" fi
判断用户输入的内容是否为空,为空则提示,不为空则判断是否为目录,不为目录则判断是否为文件,否则提示错误信息
#!/bin/bash read -p "请输入内容:" content if [ -z "$content" ] then echo "输入内容为空" elif [ -d "$content" ] then echo "是一个目录" elif [ -f "$content" ] then echo "是一个文件" else echo "输入错误" fi
- 文件判断
- -r:文件是否存在且可读
- -w:文件是否存在且可写
- -x:文件是否存在且可执行
- -f:文件是否存在且是普通文件
- -d:文件是否存在且是一个目录
- -e:文件是否存在
- -n:字符串长度是否不等于0
- -z:字符串长度是否等于0
3、case
case $变量名 in "值") 语句;; "值") 语句;; "值") 语句;; ..... *) 语句;; esac
- case 这一行最后必须为 in
- ;; ----> 结束语句
- *----> 默认分支
- esac ---> case语句的结束
- 值可以是字符串也可以是数字,还可以是区间范围,但是范围必须是:[0-9]之间
练习:
#!/bin/bash read -p "请输入产品编号:" chr case $chr in "001") echo "台灯";; "002") echo "风扇";; "003") echo "电脑";; *) echo "默认是空调";; esac
#!/bin/bash read -p "请输入对客服的满意度:" chr case $chr in [0-3]) echo "不满意";; [4-6]) echo "满意";; [7-9]) echo "非常满意";; esac
六、循环
1、for
for 变量名 in 列表 do 语句 done
练习:
#!/bin/bash #循环 for i in 1 2 3 4 5 6 7 8 9 10 do echo $i done
#!bin/bash for i in `seq 1 2 10` do echo $i done
- seq start size max
- start:开始点
- size:间隔
- max:结束点
- 如果size的值为1,则可以省略
2、while
while [ 条件 ] do 命令 done
练习:
#!bin/bash i=1 sum=0 while [ "$i" -le 100 ] do ((sum=sum+i)) ((i++)) done echo $sum
七、函数
函数名(){
代码
}
- 函数的调用
- 必须先定义再调用
- 格式:直接使用函数名
- 函数中的参数
- 使用$n来接收数据
- 返回值
- 函数中默认的存在返回值
- 正确时返回0
- 错误时返回1
- 查看返回值内容:$?
练习:
#!/bin/bash # 定义函数 add(){ sum=$(($1+$2)) return $sum } # 从键盘输入 read -p "请输入第一个数字:" aNum read -p "请输入第一个数字:" bNum echo "输入的两个数分别为:$aNum 和 $bNum" add $aNum $bNum # 输出返回值 echo "两个数之间的和为:$?"
输入一个目录,判断目录是否存在,如果不存在则给出提示,如果存在则提示输入要创建的文件名,判断创建的文件是否存在,如果不存在,则继续创建,否则提示该文件已经存在,用函数实现
#!/bin/bash # 创建文件函数 create_file(){ # 进入目录 cd $1 # 提示用户输入文件名 read -p "请输入需要创建的文件名:" filename # 判断文件是否存在 if test -e $filename then echo "文件已存在" else echo "文件不存在" echo "开始创建文件..." touch $filename echo "文件创建成功" fi } # 提示用户输入 read -p "请输入目录名:" dir if test -d $dir then # 调用创建文件函数 create_file $dir else echo "目录$dir不存在" fi