【bash】编程基本
bash变量类型:
环境变量 //当前shell进程及其子进程
本地变量 //有效范围是当前shell进程
位置变量 //$1,$2,$3代表脚本的第一个参数第二个参数,第三个参数
特殊变量
本地变量:
bash:中可以直接声明变量
例如:NAME=Jerry 表示声明了一个变量为NAME并且里面的值为Jerry .(要想查看值可以使用echo $NAME)
注意:bash默认变量存放的是字符串。即string类型
let NUM=10 则NUM中存放的时数值类型为10
注意:bash中只能做整数的的运算,不能做浮点型数字的运算
本地变量:VARNAME=VALUE:(本地变量):整个bash进程都能使用
局部变量:local VARNAME=VARLUE:(局部变量)作用域为当前代码段
环境变量:export VARNAME=VARLUE(环境变量)作用域为当前shell进程
位置变量:
$1,$2....来引用
shift 轮替 游标下移一位
shift n 游标下移n位
bash中变量的声明:
declare -i SUM 表示声明一个整形的变量,变量名为SUM
declare -x SUM 表示将SUM变量声明为环境变量
特殊变量:
$?:上一个命令的执行状态返回值:
(注意:一般程序执行完成后会有两类返回值,0:表示正确执行,1-255:表示执行错误,一般1,2,127系统预留:)
$#:参数的个数
$*:参数列表
$@:参数列表
$0:执行脚本时的脚本路径及名称
输出重定向有个特殊位置:
/dev/null 设备,但是这个设备并不存在,为软件设备即软件模拟设备,(你个他输入的任何值,它都能吞下去,并且吃人不吐骨头)为数据黑洞。
撤销变量:
unset VARNAME 表示撤销一个变量
查看当前系统中的变量:
set
查看当前shell中的环境变量:
printenv
env
export
脚本:命令的堆砌,按照实际需要,结合命令流程控制机制实现的源程序
shebang:魔术,指定程序执行的魔术
脚本必须以#!/bin/bash开头除此之外的每一行都被当做脚本的有效组成部分
# 注释行,不执行
脚本在执行时会启动一个子shell进程:
命令行中启动的脚本会继承当前shel环境变量;
系统自动执行的脚本(非命令行启动)就需要自我定义需要各环境变量
对于bash来讲默认所有变量都是字符串
引用变量:${VARNAME} 大多数情况{}可以省略
例如
ANIMAL=pig
echo "There are some $ANIMALs."
echo "There are some ${ANIMAL}s."的输出结果就不一样
注意:
【''】:为强引用,内部不能使用变量来替换
【""】:为弱引用,内部可以使用变量来替换
==============================================================================
条件判断
条件测试类型:
整数测试
字符测试
文件测试
条件测试的表达式
[ expression ]
[[ expression ]]
test expression
整数比较:
-eq:测试两个整数是否相等:比如[ $A -eq $B ] 判断A与B的值是否相等:等为0,不等为1
-ne:测试两个整数是否不等:不等为0,等为1
-gt:测试一个数是否大于一个数:大于为0,否则为1
-lt:测试一个数是否小于另一个数:小于为0,否则为1
-ge:大于或等于
-le:小于或等于
字符测试
==:测试字符串是否为真 相等为0,不等为1
!=: 测试字符串是否不等 不等为0,相等为1
>
<
-n string:测试指定的字符串是否为空,空则0,不空则1
-z string:测试指定字符串是否不空,不空为0,空为1
文件测试:
-e FILE:测试文件是否存在
-f FILE:测试文件是否为普通文件
-d FILE:测试指定目录是否为目录
-r FILE:测试指定文件对当前用户是否有“读”权限
-w FILE:测试指定文件对当前用户是否有“写”权限
-x FILE:车上指定文件对当前用户是否有“执行”权限
组合测试条件:
-a:与关系
-o:或关系
!:非关系
例如:
if [ $# -gt 1 -a $# -le 3 ] 与 if [ $# -gt 1 ] && [ $# -le 3 ]效果一样
如果用户user6不存在,就添加用户user6
! id user6 && useradd user6
id user6 || useradd user6 功能同上
命令的逻辑关系:
逻辑与: &&
第一个条件为假时,第二个条件不用再判断,最终结果已有
第一个条件为真时,第二个条件必须得判断;
逻辑或: ||
例如判断一个文件的大小
#!/bin/bash
LINES=`wc -l /etc/inittab`
echo $LINES
FINLINES=`echo $LINES | cut -d ' ' -f1 `
#echo $FINLINES
[ $FINLINES -gt 100 ] && echo "/etc/inittabl is a big file" || echo "/etc/inittab is a small file "
解释:如果/etc/inittab大于100则为大文件,反之则为小文件
如果用户存在,就显示用户存在:否则,就添加此用户:
id user1 &>/dev/null && echo "user1已经存在" || useradd user1 &>/dev/null
如果用户不存在,就添加:否则,显示其已经存在:
id user1 &>/dev/null && echo "user1用户已经存在" || useradd user1
或者
id user1 || ! useradd user1 && echo "user已经存在"
或者
! id user1 && useradd user1 || echo "user1 exists"
如果用户不存在,添加并设置密码,否则,显示其已经存在:
! id user1 && (useradd user1 && echo "user1" | passwd --stdin user1 ) || echo "user1已经存在"
文件测试:
-e FILE:测试文件是否存在
-f FILE:测试文件是否为普通文件
-d FILE:测试指定目录是否为目录
-r FILE:测试指定文件对当前用户是否有“读”权限
-w FILE:测试指定文件对当前用户是否有“写”权限
-x FILE:车上指定文件对当前用户是否有“执行”权限
例如
[ -e /etc/inittab ] //测试inittab是否存在
[ -x /etc/rc.d/rc.sysinit ] //测试rc.sysinit对当前用户是否有“执行”权限
bash变量类型:
环境变量 //当前shell进程及其子进程
本地变量 //有效范围是当前shell进程
位置变量 //$1,$2,$3代表脚本的第一个参数第二个参数,第三个参数
特殊变量
本地变量:
bash:中可以直接声明变量
例如:NAME=Jerry 表示声明了一个变量为NAME并且里面的值为Jerry .(要想查看值可以使用echo $NAME)
注意:bash默认变量存放的是字符串。即string类型
let NUM=10 则NUM中存放的时数值类型为10
注意:bash中只能做整数的的运算,不能做浮点型数字的运算
本地变量:VARNAME=VALUE:(本地变量):整个bash进程都能使用
局部变量:local VARNAME=VARLUE:(局部变量)作用域为当前代码段
环境变量:export VARNAME=VARLUE(环境变量)作用域为当前shell进程
位置变量:
$1,$2....来引用
shift 轮替 游标下移一位
shift n 游标下移n位
bash中变量的声明:
declare -i SUM 表示声明一个整形的变量,变量名为SUM
declare -x SUM 表示将SUM变量声明为环境变量
特殊变量:
$?:上一个命令的执行状态返回值:
(注意:一般程序执行完成后会有两类返回值,0:表示正确执行,1-255:表示执行错误,一般1,2,127系统预留:)
$#:参数的个数
$*:参数列表
$@:参数列表
$0:执行脚本时的脚本路径及名称
输出重定向有个特殊位置:
/dev/null 设备,但是这个设备并不存在,为软件设备即软件模拟设备,(你个他输入的任何值,它都能吞下去,并且吃人不吐骨头)为数据黑洞。
撤销变量:
unset VARNAME 表示撤销一个变量
查看当前系统中的变量:
set
查看当前shell中的环境变量:
printenv
env
export
脚本:命令的堆砌,按照实际需要,结合命令流程控制机制实现的源程序
shebang:魔术,指定程序执行的魔术
脚本必须以#!/bin/bash开头除此之外的每一行都被当做脚本的有效组成部分
# 注释行,不执行
脚本在执行时会启动一个子shell进程:
命令行中启动的脚本会继承当前shel环境变量;
系统自动执行的脚本(非命令行启动)就需要自我定义需要各环境变量
对于bash来讲默认所有变量都是字符串
引用变量:${VARNAME} 大多数情况{}可以省略
例如
ANIMAL=pig
echo "There are some $ANIMALs."
echo "There are some ${ANIMAL}s."的输出结果就不一样
注意:
【''】:为强引用,内部不能使用变量来替换
【""】:为弱引用,内部可以使用变量来替换
==============================================================================
条件判断
条件测试类型:
整数测试
字符测试
文件测试
条件测试的表达式
[ expression ]
[[ expression ]]
test expression
整数比较:
-eq:测试两个整数是否相等:比如[ $A -eq $B ] 判断A与B的值是否相等:等为0,不等为1
-ne:测试两个整数是否不等:不等为0,等为1
-gt:测试一个数是否大于一个数:大于为0,否则为1
-lt:测试一个数是否小于另一个数:小于为0,否则为1
-ge:大于或等于
-le:小于或等于
字符测试
==:测试字符串是否为真 相等为0,不等为1
!=: 测试字符串是否不等 不等为0,相等为1
>
<
-n string:测试指定的字符串是否为空,空则0,不空则1
-z string:测试指定字符串是否不空,不空为0,空为1
文件测试:
-e FILE:测试文件是否存在
-f FILE:测试文件是否为普通文件
-d FILE:测试指定目录是否为目录
-r FILE:测试指定文件对当前用户是否有“读”权限
-w FILE:测试指定文件对当前用户是否有“写”权限
-x FILE:车上指定文件对当前用户是否有“执行”权限
组合测试条件:
-a:与关系
-o:或关系
!:非关系
例如:
if [ $# -gt 1 -a $# -le 3 ] 与 if [ $# -gt 1 ] && [ $# -le 3 ]效果一样
如果用户user6不存在,就添加用户user6
! id user6 && useradd user6
id user6 || useradd user6 功能同上
命令的逻辑关系:
逻辑与: &&
第一个条件为假时,第二个条件不用再判断,最终结果已有
第一个条件为真时,第二个条件必须得判断;
逻辑或: ||
例如判断一个文件的大小
#!/bin/bash
LINES=`wc -l /etc/inittab`
echo $LINES
FINLINES=`echo $LINES | cut -d ' ' -f1 `
#echo $FINLINES
[ $FINLINES -gt 100 ] && echo "/etc/inittabl is a big file" || echo "/etc/inittab is a small file "
解释:如果/etc/inittab大于100则为大文件,反之则为小文件
如果用户存在,就显示用户存在:否则,就添加此用户:
id user1 &>/dev/null && echo "user1已经存在" || useradd user1 &>/dev/null
如果用户不存在,就添加:否则,显示其已经存在:
id user1 &>/dev/null && echo "user1用户已经存在" || useradd user1
或者
id user1 || ! useradd user1 && echo "user已经存在"
或者
! id user1 && useradd user1 || echo "user1 exists"
如果用户不存在,添加并设置密码,否则,显示其已经存在:
! id user1 && (useradd user1 && echo "user1" | passwd --stdin user1 ) || echo "user1已经存在"
文件测试:
-e FILE:测试文件是否存在
-f FILE:测试文件是否为普通文件
-d FILE:测试指定目录是否为目录
-r FILE:测试指定文件对当前用户是否有“读”权限
-w FILE:测试指定文件对当前用户是否有“写”权限
-x FILE:车上指定文件对当前用户是否有“执行”权限
例如
[ -e /etc/inittab ] //测试inittab是否存在
[ -x /etc/rc.d/rc.sysinit ] //测试rc.sysinit对当前用户是否有“执行”权限