一.shell概述
shell是一个命令行解析器,它接收应用程序/用户命令,然后调用操作系统内核。同时shell也是一个功能强大的编程语言,易编写,易调试,灵活性强。
二.shell 解析器
1.linux提供的shell解析器有
[root@node-4 ~]# cat /etc/shells
/bin/sh
/bin/bash
/sbin/nologin
/bin/dash
/bin/tcsh
/bin/csh
2.bash和sh的关系
# sh 是bash的软连接
[root@node-4 bin]# ll | grep bash
-rwxr-xr-x 1 root root 941880 5月 11 2016 bash
lrwxrwxrwx. 1 root root 4 3月 9 09:20 sh -> bash
3.centos默认的解析器是bash
[root@node-4 bin]# echo $SHELL
/bin/bash
三.shell脚本入门
1.脚本格式
# 以如下开头,实际上也是指定解析器的过程
#!/bin/bash
2.编写第一个脚本:输出hello world
vi helloworld.sh
# 输入以下内容
#!/bin/bash
echo "helloworld"
3.脚本的执行
**第一种:**采用bash或sh+路径+文件名的方式(不需要赋予脚本+x权限)
sh+路径
sh helloworld.sh
bash+路径
bash helloworld.sh
**第二种:**输出路径+文件名(需要赋予脚本执行权限+x)
# 赋予执行权限
chmod u+x helloworld.sh
# 执行
./helloworld.sh
注意:
第一种执行方法,本质是bash解析器帮你执行脚本,所以脚本本身不需要执行权限。
第二种执行方法,本质是脚本需要自己执行,所以需要执行权限。
四.shell中的变量
1.常用系统变量
$HOME
$PWD
$SHELL
$USER
# 查看当前shell中的所有变量
set
2.自定义变量
1.基本语法
定义变量:变量=值
撤销变量:unset 变量
声明静态变量:readonly 变量,注意静态不能unset,(关闭当前会话,静态变量消失)
2.变量定义规则
变量名称可以由字母,数字和下划线组成,但是不能以数字开头,环境变量名建议大写
等号两侧不能由空格
在bash中,变量默认类型都是字符串类型,无法直接进行数值运算
变量的值如果有空格,需要使用双引号或单引号括起来
3.案例实操
1.定义变量
2.给定义的变量重新赋值
3.撤销变量
4.声明静态变量,不能unset
5.在bash中默认的字符类型都是字符串类型,无法直接进行数值运算
6.变量的值如果有空格,需要使用双引号或者单引号括起来
7.可以将变量提升为全局变量,可供其他shell程序使用
3.特殊变量$n
1.基本语法
$n(功能描述:n为数字,$0代表脚本名称,$1-{10})
2.输出该脚本的名称,将参数1,参数2的值输出
4.特殊变量$#
1.基本语法
$# (功能描述:获取所有输入参数个数,常用于循环)
2.获取输入参数的个数
5.特殊变量 @
1.基本语法
*把所有的参数看成一个整体)
@把每个参数区分对待)
2.打印输入的参数
6.特殊变量 $?
1.基本语法
$? (功能描述:最后一次执行命令的返回状态,如果这个返回值为0,代表上一条命令执行成功,返回非0,具体是那个数,由命令自己决定,则证明上一条命令没有正确执行)
2.判断helloworld.sh 脚本是否正确执行
五.运算符
1.基本语法
$((运算式)) 或 $[运算式]
# expr 运算符间要有空格
expr +,-,\*,/,% 加,减,乘,除,取余
2.计算(2+3)x4
expr `expr 2 + 3` \* 4
六.条件判断
1.基本语法
# condition前后需有空格
# 条件非空即为true,如 [ string ] 为true, []返回false
[ condition ]
2.常用判断条件
1.两个整数之间比较
命令 | 解释 |
= | 字符串比较 |
-lt | 小于(less than) |
-le | 小于等于(less equal) |
-eq | 等于(equal) |
-gt | 大于(greater than) |
-ge | 大于等于(greater equal) |
-ne | 不等于(Not equal) |
2.按照文件权限进行判断
-r | 读的权限(read) |
-w | 有读的权限(write) |
-x | 有执行的权限(execute) |
3.按照文件类型进行判断
-f | 文件存在并且是一个常规的文件(file) |
-e | 文件存在(existence),有可能是软连接 |
-d | 文件存在并是一个目录(directory) |
七.流程控制(重点)
1.if判断
1.基本语法
# [ 条件判断式 ],中括号和条件判断式中间必须有空格
# if后面要有空格
if [ 条件判断式 ];then
程序
fi
或者
if [ 条件判断式 ]
then
程序
fi
2.案例实操
输入一个数字,如果是1,则输出banzhang zhen shuai,如果是2,则输出cls zhen mei,如果是其它,什么也不输出。
#!/bin/bash
if [ $1 -eq '1' ];then
echo 'banzhang zhen shuai'
elif [ $1 -eq '2' ];then
echo 'cls zhen mei'
fi
2.case语句
1.基本语法
case $变量名 in
"值1")
如果变量的值为1,则执行程序1
;;
"值2")
如果变量的值为2,则执行程序2
;;
*)
如果变量的值不是以上,则执行此程序
;;
esac
2.注意
1.case行尾必须为单词in,每个模式匹配必须以括号 “)” 结束
2.双分号 ;; 表示命令结束,相当于java中的break
3.最后的 *) 表示默认模式,详单与java中的default
实操:
输入一个数字,如果是1,则输出banzhang,如果是2,则输出cls,如果是其它,输出renyao。
#!/bin/bash
case $1 in
"1")
echo "banzhang"
;;
"2")
echo "cls"
;;
*)
echo "renyao"
;;
esac
3.for循环