Shell编程
shell :弱类型、 解释型语言
解释器:bash
一、变量
bash的变量类型:
环境变量
本地变量(局部变量)
位置变量
特殊变量:bash内置的用来保存某些特殊数据的变量。(也叫系统变量)
本地变量:只属于某一个bash的变量。
var_name=值
作用域:整个bash进程
局部变量:
local var_name =值,
作用域:当前代码段。
环境变量:
export 名字=值
作用域:当前的shell和其子shell。
注意:脚本在执行时都会启动一个子shell进程:
命令行中启动的脚本会继承当前shell环境变量。
系统自动启动脚本(非命令行启动):则需要自我定义环境变量。
位置变量: 用于 脚本执行的参数,$1 表示第一个参数,以此类推
$1,$2….
特殊变量:
$? 上一个命令的执行状态返回值。
$# 传递到脚本的参数个数
$* 传递到脚本的参数,与位置变量不同,此选项参数可超过9个
$$ 脚本运行时当前进程的ID号,常用作临时变量的后缀,如 haison.$$
$! 后台运行的(&)最后一个进程的ID号
$@ 与$#相同,使用时加引号,并在引号中返回参数个数
$- 上一个命令的最后一个参数
$? 最后命令的退出状态,0表示没有错误,其他任何值表明有错误
程序有两类返回值:
1、 执行结果
2、 执行状态,$? : 0:表示正确,1-255:错误
输出重定向:
> 覆盖重定向
>> 追加重定向
2> 错误覆盖重定向
2>> 错误追加重定向
&> 全部重定向
撤销变量:
unset 变量名
查看shell中变量:
set 命令
查看shell中的环境变量
printenv
env
export
引用变量:${变量名},一般可以省略{}
单引号:强引用,不作变量替换
双引号:弱引用,做变量替换
反引号:``命令替换
二、脚本
条件判断:
条件表达式:
1、 [ expression ]
2、 test expression
整数比较:
-eq : 比如:[ $A –eq $B ]
-ne , -gt ,-lt,-ge,-le
命令的逻辑关系:
在linux 中 命令执行状态:0 为真,其他为假
逻辑与: &&
第一个条件为假时,第二条件不用再判断,最终结果已经有;
第一个条件为真时,第二条件必须得判断;
逻辑或: ||
逻辑非: !
命令执行的状态 的逻辑关系
1、如果用户user6不存在则添加用户6
! id user6 && useradd user6
Id user6 || useradd user6
备注:
passwd默认是要用终端作为标准输入,加上--stdin表示可以用任意文件做标准输入
于是这里用管道作为标准输入
条件判断,控制结构:
If 条件 ;then
语句
elif 条件 ; then
语句
else
语句
fi
-a : 逻辑与,并且 : if [ $# -gt 1 –a $# -lt 3 –o $# -eq 2 ] ; then
-o :或者
bash -n shell文件 :检查文件是否有语法错误。
bash –x shell 文件 :debug 执行文件
Shell 中如何算术运算
1、 let 算术运算表达式
let C=$A + $B
2、$[算术表达式]
C = $[$A+$B]
3、$((算术表达式))
C=$(($A+$B))
3、 expr 算术表达式 ,注意:表达式中各操作数及运算符之间要有空格。而且要使用命令引用
C=`expr $A + $B`
exit : 退出脚本
退出脚本可以指定脚本执行的状态:exit 0 。
复习:
测试方法:
[ 表达式 ]
[[ 表达式 ]]
test 表达式
INT1=33
INT2=32
[ $INT1 -eq $INT2 ]
[[ $INT1 -eq $INT2 ]]
test $INT1 -eq $INT2
文件测试: [ ] 需要中括号
-e FILE :测试文件是否存在
-f FILE :测试文件是否为普通文件
-d FILE :测试文件是否为目录
-r 权限
-w
-x
特殊变量:
$# $@
字符串测试:
== 等号两端需要空格
!=
-n string : 判断字符串是否为空
-s string : 判断字符串是否不空
循环:进入条件,退出条件
for 变量 in 列表 ; do
语句
done
比如: for I in 1 2 3 4 5 ;do
语句
done、
如何生成列表:
1、{1..100}
2、seq [起始数] [跨度数] 结束数
3、ls /etc 文件列表
While 循环
格式一
while 条件;do
语句
[break]
done
格式二 死循环
while true
do
语句
done
格式三 死循环
while :
do
语句
done
格式四 死循环
while [ 1 ]
do
语句
done
格式五 死循环
while [ 0 ]
do
语句
done
case 语句
case 变量 in
value1)
语句
;;
value2)
语句
;;
*)
语句
;;
esac