已整理-shell脚本编程资料整理
目录:
1、变量的定义与类型
变量:为了适应多变的环境需求,会变化的量,以不变的名称存储可以变化的值,类似容器
定义变量:a=100
提取变量值:echo $a
销毁变量:unset a
为了和户的体验,降低脚本的使用难度,产生交互,向脚本中传递命令行参数:
read -p 'please input your create username:' username
-p 输出屏幕提示信息
1)、产生交互; 2)、记录用户在键盘输入; 3)、将记录的信息赋值给一个变量储存;
1.1 变量的种类:
【环境变量】: 变量名一般都大写,用来设置用户/系统环境;
【位置变量】: bash内置,存储执行脚本时提供的命令参数;
【预定义变量】:bash内置,可直接调用的特殊值,不能直接修改;
【自定义变量】: 用户自主设置、修改及使用;
环境变量:由系统定义,并且赋值完成,一般变量名为大写;
常见的环境变量:
PWD / PATH / USER / LOGNAME / SHELL / HOME
USER=当前登陆有用户
env 显示所有环境变量
set 查看所有变量
自定义环境变量:
# export ada=100 #定义环境变量
# export -n ada #取消环境变量,恢复到普通变量
位置变量:由系统定义完成,在执行脚本时提供的命令行参数,表示为$n ,其中n为序号;
$1,$2,....${10},${11}....
$0 表示bash脚本文件名
预定义变量:用来保存脚本程序的执行信息,直接使用这些变量,不能直接为这些变量赋值;
$# ->已加载的位置变量的个数
$? ->程序退出后的状态值, 0表示正常,其它值表示异常
判断用户是否输入参数? 当$#的值为0的时候,说明没有输入参数;
自定义变量:根据变量的用途不同区分,用户自主设置、修改及使用;
a=100
unset a #取消自定义变量
以下是常用变量:
#! /bin/bash
echo $1 脚本后跟的第1个参数
echo $2 脚本后跟的第2个参数
echo $3 脚本后跟的第3个参数
echo $$ 当前脚本的进程号
echo $# 位置变量的个数
echo $* 所有位置变量
echo $? 上一条指令的结果,0代表正常,非0是异常
echo $0 执行脚本的名字
echo $! 最后一条放入后台的程序进程号
stty -echo #关闭回显
stty echo #回显
1.2 取变量值
单引号:'' 取消原来的意义
反撇号:`` 与 $() 将命令的输出,当做参数直接参与下一个命令的运行
----------------------------------------------------------------------------------------------------------------------------------
2、配置用户环境
alias 别名
语法:
定义别名:alias 别名='程序路径'
取消别名:unalias 别名
~/.bashrc 指定用户每次开启bash 终端生效
/etc/bashrc 影响所有用户
# cat /etc/shells #查看系统拥用的解释器
---------------------------------------------------------------------------------------------------------------------------------
3、shell的整数运算
3.1、expr 1 + 3 #不支持小数,运算符前面都需要空格,否则运算不成功,如果是乘法需要用: \* 表示
# expr 1 + 3
4
3.2、echo $[] #不支持小数,运算后,显示不了结果,需要配合echo
# echo $[100+20]
3.3、let #不支持小数,也支持变量值的变化,不显示结果
# let a=a+100
# let a++
# let a+=2
3.4、echo "scale=3;10/3"|bc #bc进行非交互式计算,支持小数
----------------------------------------------------------------------------------------------------------------
4、条件测试
4.1、字符串比较
== 是否相等
!= 是否不相等
-z 判断是否为空, 空为真,非空为假
-n 判断是否不为空,非空为真, 空为假
[ abc == abc ]
[ $USER == "root" ] && echo 'successful.'
[ $USER != "root" ] && echo 'successful.'
4.2、数字比较
-eq 等于
-ne 不等于
-gt 大于
-ge 大于等于
-lt 小于
-le 小于等于
4.3、文件状态判词
-e 判断文件是否存在,不区分文件种类,不管是文件还是目录
-f 判断文件是否存在,是文件为真
-d 判断文件目录是否存在,是目录为真
如果取反,前面加 ! -e 即可;
-r 判断文件是否有读权限
-w 判断文件是否有写权限
-x 判断文件是否有执行权限
4.4、逻辑判断
&& 前面任务成功,才执行后续任务
|| 前面任务失败,才执行后续任务
; 前面任务执行完毕后,继续执行后面的命令
----------------------------------------------------------------------------------------------------------------
5、if条件分支
if双分支处理:
双分支,当条件满足/不满足时,分别xx/yy处理
如果软件包foo未装,则将其安装;
否则,放弃安装
语法:
if 条件测试; then
命令序列xx
else
命令序列xx
fi
示例:
判断用户是否存在?
#! /bin/bash
id $1 &>/dev/null
if [ $? -eq 0 ]; then
echo 'user is esxits'
else
echo 'user is not esxits'
fi
if多分支
语法:
if 条件测试; then
命令序列xx
elif 条件测试; then
命令序列xx
else
命令序列xx
fi
示例:
#! /bin/bash
read -p 'please input your core:' core
if [ $core -ge 90 ]; then
echo 'youxiu'
elif [ $core -ge 80 ]; then
echo 'lianghao'
elif [ $core -ge 70 ]; then
echo 'yiban'
elif [ $core -ge 60 ]; then
echo 'jige'
else
echo 'liangliang'
fi
-------------------------------------------------------------------------------------------------------------
6、循环
for循环:给定一批对象,反复执行类似的操作
语法:
for 变量名 in 值列表
do
命令序列
done
for i in {1..5}
do
echo $i
done
while 条件测试
do
任务序列
done
while : #永远执行任务
do
任务序列
done
-----------------------------------------------------------------------------------------------------------
7、case分支
case分支,是简化版本的if,代码编写比if精简,但功能不如if强大;
语法:
case 变量 in
模式1)
命令序列;;
模式2)
命令序列;;
*)
命令序列
esac
case $1 in
aa|a)
echo aaaa;;
bb|b)
echo bbbb;;
*)
echo ccccc
esac
-----------------------------------------------------------------------------------------------------------
8、函数
函数可以定义公共的语句块,在脚本中反复调用,达到精简脚本的目的
函数定义语法:
function 函数名 { #第1种定义语法
}
函数名(){ #第2种定义语法
}
函数名 #调用
#!/bin/bash
start(){
echo 'test'
exit 100
}
start
----------------------------------------------------------------------------------------------------------
9、流程控制语句
wait 等待所有后台进程执行完毕,再执行后面的命令;
exit 终止脚本程序
break 跳出循环,执行循环后任务
continue 结束本次循环,继续下一次循环
------------------------------------------------------------------------------------------------------------------
10、shell 数组
shell数组特点:
1)、数组中可以存放多个值;
2)、Bash Shell 只支持一维数组(不支持多维数组),初始化时不需要定义数组大小(与 PHP 类似);
3)、与大部分编程语言类似,数组元素的下标由 0 开始;
4)、Shell 数组用括号来表示,元素用"空格"符号分割开;
定义数组语法格式如下:
array_name=(value1 value2 ... valuen)
定义数组实例:
my_array=(A B "C" D)
也可以使用数字下标来定义数组:
array_name[0]=value0
array_name[1]=value1
array_name[2]=value2
读取数组元素值的一般格式是:
${array_name[index]}
完整实例:
#!/bin/bash
my_array=(A B "C" D)
echo "第一个元素为: ${my_array[0]}"
echo "第二个元素为: ${my_array[1]}"
echo "第三个元素为: ${my_array[2]}"
echo "第四个元素为: ${my_array[3]}"
获取数组中的所有元素:
使用 @ 或 * 可以获取数组中的所有元素,例如:
echo "数组的元素为: ${my_array[*]}"
echo "数组的元素为: ${my_array[@]}"
获取数组的长度:
获取数组长度的方法与获取字符串长度的方法相同,例如:
echo "数组元素个数为: ${#my_array[*]}"
echo "数组元素个数为: ${#my_array[@]}"
关联数组
bash 支持关联数组,可以使用任意的字符串、或者整数作为下标来访问数组元素。
关联数组使用 declare 命令来声明,语法格式如下:
declare -A array_name
-A 选项就是用于声明一个关联数组。
关联数组的键是唯一的。
以下实例我们创建一个关联数组 site,并创建不同的键值:
declare -A site=(["google"]="www.google.com" ["runoob"]="www.runoob.com" ["taobao"]="www.taobao.com")
我们也可以先声明一个关联数组,然后再设置键和值:
declare -A site
site["google"]="www.google.com"
site["runoob"]="www.runoob.com"
site["taobao"]="www.taobao.com"
echo ${site["runoob"]}