什么是shell
linux 命令组合在一起变成shell脚本,减轻了工作量,提高工作效率。
Shell就是一个用户跟操作系统之间的一个命令解释器。
常见的shell 有哪些
- Bourne Shell(/usr/bin/sh或/bin/sh)
- Bourne Again Shell(/bin/bash)
- C Shell(/usr/bin/csh)
- K Shell(/usr/bin/ksh)
- Shell for Root(/sbin/sh)
最常用的shell是bash。Bash是大多数Linux操作系统默认的Shell环境。
shell 编程注意事项
- shell脚本文件的命名:Shell脚本名称命名一般为英文、大写、小写,后缀以.sh 结尾。PS:Linux文件没有后缀代表文件类型的说法,添加后缀只是为了见名知意
- 脚本首行需要
#!/bin/bash
开头 - 变量命名 变量命名规范
变量
Shell编程中变量分为三种,分别是系统变量、环境变量和用户变量
系统变量
主要是用于对参数判断和命令返回值判断时使用,系统变量详解如下:
$0 当前脚本的名称
$n 当前脚本的第n个参数
$* 当前脚本的所有参数(不包括程序本身)
$# 当前脚本的参数个数(不包括程序本身)
$? 命令或程序执行完后的状态,返回0表示执行成功
$$ 程序本身的PID号
环境变量
主要用于程序运行时,先设置,再使用,常见的命名如下
PATH 命令所示路径,以冒号为分割
HOME 打印用户家目录
SHELL 显示当前Shell类型
USER 打印当前用户名
ID 打印当前用户id信息
PWD 显示当前所在路径
TERM 打印当前终端类型
HOSTNAME 显示当前主机名
PS1 定义主机命令提示符的
HISTSIZE 历史命令大小,可通过 HISTTIMEFORMAT 变量设置命令执行时间
RANDOM 随机生成一个 0 至 32767 的整数
HOSTNAME 主机名
用户环境变量
自定义shell环境变量
用户变量又称为局部变量,在Shell脚本内部或者临时局部使用
Httpd_sort=httpd-2.4.6-97.tar
BACK_DIR=/data/backup/
IPaddress=10.0.0.1
数组
格式:array=(元素 1 元素 2 元素 3 ...)
用小括号初始化数组,元素之间用空格分隔。
- 定义方法 1:初始化数组 array=(a b c)
- 定义方法 2:新建数组并添加元素 array[下标]=元素
- 定义方法 3:将命令输出作为数组元素array=($(command))
#!/bin/bash
IP=(10.0.0.1 10.0.0.2 10.0.0.3)
# #IP[*] 数组所有元素
# ${#IP[*]} 数组大小
for ((i=0;i<${#IP[*]};i++)); do
echo ${IP[$i]}
done
流程控制
if条件语句
If
条件判断语句,通常以if
开头,fi
结尾。也可加入else
或者elif
进行多条件的判断
# 单分支语句
if (表达式);then
语句1
fi
# 多支条件语句
if (表达式)
语句1
elif
语句2
elif
语句2
fi
常见逻辑判断运算符
-f 判断文件是否存在 eg: if [ -f filename ];
-d 判断目录是否存在 eg: if [ -d di];
-eq 等于,应用于整型比较 equal;
-ne 不等于,应用于整型比较 not equal;
-lt 小于,应用于整型比较 letter;
-gt 大于,应用于整型比较 greater;
-le 小于或等于,应用于整型比较;
-ge 大于或等于,应用于整型比较;
-a 双方都成立(and) 逻辑表达式 –a 逻辑表达式;
-o 单方成立(or) 逻辑表达式 –o 逻辑表达式;
-z 空字符串;
-x 是否具有可执行权限
|| 单方成立;
&& 双方都成立表达式。
循环语句
for
格式1:for (i=0;i <n;i++);do list ; done
格式2:for name [ [ in [ word ... ] ] ; ] do list ; done
for (i=0;i<n;i++); do
语句
done
for 变量名 in 取值列表; do
语句 1
done
举个例子
#方法 1:
#!/bin/bash
IP=(10.0.0.1 10.0.0.2 10.0.0.3)
for ((i=0;i<${#IP[*]};i++)); do
echo ${IP[$i]}
done
# bash test.sh
10.0.0.1
10.0.0.2
10.0.0.3
#方法 2:
#!/bin/bash
IP=(10.0.0.1 10.0.0.2 10.0.0.3)
for IP in ${IP[*]}; do
echo $IP
done
while
格式以while…do
开头,done
结尾
与while 关联的还有一个until
语句,当条件表达式为 false 时才循环,使用比较少。
while (表达式)
do
语句1
done
break 和 continue 语句
break
是终止循环,在嵌套循环中,break 命令后面还可以跟一个整数,表示跳出第几层循环。
continue
是跳出当前循环,同样,continue 后面也可以跟一个数字,表示跳出第几层循环。
case选择语句
语法格式以case…in
开头,esac
结尾。
每个模式必须以右括号
结束,命令结尾以双分号
结束
case 模式名 in
模式 1)
命令
;;
模式 2)
命令
;;
*)
不符合以上模式执行的命令
esac
举个栗子
#!/bin/bash
#判断用户输入
read -p "Please choose yes/no: " -t 30 cho
#在屏幕上输出"请选择yes/no",然后把用户选择赋予变量cho
case $cho in
#判断变量cho的值
"yes")
#如果是yes
echo "Your choose is yes!"
#则执行程序1
;;
"no")
#如果是no
echo "Your choose is no!"
#则执行程序2
;;
*)
#如果既不是yes,也不是no
echo "Your choose is error!"
#则执行此程序
;;
esac
select语句
select
是一个类似于 for 循环的语句
其语法格式以select…in do
开头,done
结尾
# variable 表示变量,value_list 表示取值列表,in 是 Shell 中的关键字
select variable in value_list
do
statements
done
举个栗子
#!/bin/bash
echo "What is your favourite OS?"
select name in "Linux" "Windows" "Mac OS" "UNIX" "Android"
do
case $name in
"Linux")
echo "Linux是一个类UNIX操作系统,它开源免费,运行在各种服务器设备和嵌入式设备。"
break
;;
"Windows")
echo "Windows是微软开发的个人电脑操作系统,它是闭源收费的。"
break
;;
"Mac OS")
echo "Mac OS是苹果公司基于UNIX开发的一款图形界面操作系统,只能运行与苹果提供的硬件之上。"
break
;;
"UNIX")
echo "UNIX是操作系统的开山鼻祖,现在已经逐渐退出历史舞台,只应用在特殊场合。"
break
;;
"Android")
echo "Android是由Google开发的手机操作系统,目前已经占据了70%的市场份额。"
break
;;
*)
echo "输入错误"
exit 1
;;
esac
done
ps:exit 是一个 Shell 内置命令,用来退出当前 Shell 进程,并返回一个退出状态,使用$?可以接收这个退出状态。
exit 命令可以接受一个整数值作为参数,代表退出状态。默认状态值是 0。
一般情况下,退出状态为 0 表示成功,退出状态为非 0 表示执行失败(出错)了。
exit 退出状态只能是一个介于 0~255 之间的整数,其中只有 0 表示成功,其它值都表示失败。
函数
语法格式以function name() {…}。
默认不能将参数传入()内部,参数传递在调用函数名称传递,例如:name args1 args2
通过函数名直接调用,不加小括号
#!/bin/bash
func() {
VAR=$((1+1))
return $VAR
echo "This is a function."
}
# 调用
func
# 命令或程序执行完后的状态,返回0表示执行成功
echo $?