shell介绍:
#为什么使用shell脚本?
shell脚本实现自动化运维 可以自动化管理系统
#查看系统中支持的所有shell类型
#cat /etc/shells
#chsh -l
#如何切换shell
直接输入shell的名字
例: #ksh
切换到ksh
sh,bash,nologin,tcsh,csh,ksh
#查看当前使用的shell
#echo $SHELL
#bash功能和特点
1 命令和文件自动补齐
2 历史记录功能 上下键、!number、!string、!$、!!、^r
3 别名功能 alias、unalias cp、~username/.bashrc、\cp -rf /etc/hosts .
4 快捷键 ^c、^d、^a、^e、^l、^s、^q
5 前后台作业控制 &、nohup、^c、^z、bg、fg %1、kill %3
6 输入输出重定向 0,1,2, >, >>, 2>, 2>>, 2>&1, &>, <, cat <
7 管道 | tee ip addr |grep 'inet ' |tee -a test |grep eth0 -a 追加
8 命令排序
; 不具备逻辑判断
&& 具备逻辑判断
|| 具备逻辑判断
9 shell元字符表示的不是本意
* ? & ; $ [] () {} \
10 变量
11 shell script 脚本
#如何执行shell脚本
1 # source demo.sh 不需要执行权限 在当前shell中执行
2 # . demo.sh 不需要执行权限 在当前shell中执行
3 # sh demo.sh 不需要执行权限 在子shell中执行
# sh -x demo.sh 以调试的方式执行
# sh -n demo.sh 仅调试 syntax error
4 # bash demo.sh 不需要执行权限 在子shell中执行
5 # ./demo.sh 需要执行权限 在子shell中执行
#修改shell脚本执行权限
#vim demo.sh
#chmod a+x demo.sh
shell变量
#什么是变量?
用一串固定的字符来保存经常变化的字符
#变量的类型
1 自定义变量
用户在编写脚本时根据自己的需求定义的变量
2 系统环境变量
系统在启动的过程中读取自己的配置文件定义的变量
PATH=/bin/:$PATH
3 位置变量
$1 $2 $3 $4 $5 $6 $7 $8 $9 ${10}
4 预定义变量
$* $@ $# $$ $?(上一个命令的返回值 0表示成功)
#变量的定义
例: #name=gaoyaohua
变量名字=变量值
注: 变量名命名必须以字母或下划线开头
区分大小写字母
例: #export name=gaoyaohua
例: #wo=gaoyaohua
#export wo
export把变量定义为全局环境变量(当前shell跟子shell都有效)
#变量的取消
例: #unset name
#变量的查看
#set //显示系统内的所有变量,包括自定义变量
#env //只显示系统环境变量,不会显示自定义变量
#变量的调用
例: #echo $name
$变量名
例: #echo 'your name is $name.'
' ' 单引号 变量原样输出(弱引用)
例: #echo "your name is $name."
" " 双引号 变量被变量值取代(强引用)
#创建数组变量
方法一: 一次赋一个值
数组名[下标]=变量值
# array[0]=pear
# array[1]=apple
# array[2]=orange
# array[3]=peach
方法二: 一次赋多个值
# array=(tom jack alice)
# array=(`cat /etc/passwd`) 希望是将该文件中的每一个行作为一个元数赋值给数组array3
# array=(`ls /var/ftp/shell/for*`)
# array=(tom jack alice "bash shell")
# declare -a
declare -a array='([0]="pear" [1]="apple" [2]="orange" [3]="peach")'
declare -a array='([0]="tom" [1]="jack" [2]="alice")'
访问数组元数:
# echo ${array[0]} 访问数组中的第一个元数
# echo ${array[@]} 访问数组中所有元数 等同于 echo ${array1[*]}
# echo ${#array[@]} 统计数组元数的个数
# echo ${array[@]:1} 从数组下标1开始
# echo ${array[@]:1:2} 从数组下标1开始,访问两个元素
条件语句:
#整数值比较
[ 整数1 选项 整数2 ]
-ne 不等于
-eq 等于
-ge 大于等于
-le 小于等于
-gt 大于
-lt 小于
#字符串比较
[ 字符串1 比较符 字符串2 ]
== 或 =
!=不等于
-z 测试字符串是null的时候为真
#逻辑比较
[ 表达式1 ] 符号 [ 表达式2 ] 符号 [ 表达式3 ]
&& -a and
|| -o or
流程控制:
# 条件语句
单分支
if[ 条件表达式 ];then
echo "demo 1"
fi
双分支
if [ 条件表达式 ]
then
echo "demo2"
else
echo "demo3"
fi
多分支结构
if [ 条件表达式 ];then
echo "demo 1"
elif [ 条件表达式 ];then
echo "demo 2"
elif [ 条件表达式 ];then
echo "demo 3"
elif [ 条件表达式 ];then
echo "demo 4"
else
echo "demo 5"
fi
#循环语句
for
for 变量名 in 变量值列表
do
echo "demo 1"
done
while
while 条件表达式
do
echo "demo 1"
done
until
until 条件表达式
do
echo "demo 1"
done
#选择语句
case
case $变量名 in
模式1)
echo "demo 1"
;;
模式2)
echo "demo 1"
;;
模式3)
echo "demo 1"
;;
*)
echo "demo 1"
;;
esac
例子:
select choice in green blue red quit "bash shell"
do
case $choice in
red)
echo "红色"
;;
green)
echo "绿色"
;;
blue)
echo "蓝色"
;;
*)
exit
esac
done
函数:
#函数
完成特定功能的代码片段(块)
在shell中定义函数可以使用代码模块化,便于复用代码
函数必须先定义才可以使用
#定义函数的方法
方法一:
函数名() {
函数要实现的功能代码
}
方法二:
function 函数名 {
函数要实现的功能代码
}
#调用函数的方法
函数名
函数名 参数1 参数2
exit
break
continue
shift
shift 作用:使位置参数向左移动,默认移动1位,可以使用shift 2
exit 退出整个程序
break 结束当前循环,或跳出本层循环
continue 忽略本次循环剩余的代码,直接进行下一次循环