变量
变量类型:
1. 环境变量
2. 本地变量(局部变量)
3. 位置变量
4. 特殊变量
1、 环境变量
export VARNAME=VALUE
VARNAME=VALUE
export VARNAME “导出”
2、 本地变量:
set VARNAME=VALUE: 作用域为整个bash进程;
3、局部变量
local VARNAME=VALUE:作用域为当前代码段;
4、 位置变量
$1, $2, ...
shift 轮替
5、 特殊变量
$:表示当前shell的进程ID即PID
$0:当前脚本的文件名
$n:传递给脚本或函数,n是一个数字,表示第几个参数
$#:传递给脚本或函数的参数个数
$*:传递给脚本或函数的所有参数
$@:传递给脚本或函数的所有参数,被引号包含时与$*不同
$?:上一个命令的退出状态或函数的返回值
$$:当前shell进程ID,对于shell脚本就是这些脚本所在的进程ID
撤消变量:
unset VARNAME
1、查看当前变量:
set
2、 查看当前shell中的环境变量:
printenv
env
export
条件判断
条件测试类型:
1、整数测试
2、字符测试
3、文件测试
条件测试的表达式:
[ expression ]
[[ expression ]]
test expression
1、整数比较
-eq: 测试两个整数是否相等;比如 $A -eq $B
-ne: 测试两个整数是否不等;不等,为真;相等,为假;
-gt: 测试一个数是否大于另一个数;大于,为真;否则,为假;
-lt: 测试一个数是否小于另一个数;小于,为真;否则,为假;
-ge: 大于或等于
-le:小于或等于
例如:
INT1=63
INT2=77
[ $INT1 -eq $INI2 ]
[[ $INT1 -eq $INT2 ]]
test $INT1 -eq $INT2
2、 文件测试
-e FILE:测试文件是否存在
-f FILE: 测试文件是否为普通文件
-d FILE: 测试指定路径是否为目录
-r FILE: 测试当前用户对指定文件是否有读取权限;
-w FILE: 测试
-x FILE: 测试
例如:
[ -e /etc/inittab ]
[ -x /etc/rc.d/rc.sysinit ]
3、字符测试
==:测试是否相等,相等为真,不等为假
!=: 测试是否不等,不等为真,等为假
>
<
-n string: 测试指定字符串是否为空,空则真,不空则假
-z string: 测试指定字符串是否不空,不空为真,空则为假
4、组合测试条件
-a :与关系
-o :或关系
!:非关系
例如
if [ $# -gt 1 -a $# -le 3 ] 测试大于1小于3的数
等价于 if [ $# -gt 1 ]&&if[ $# -le 3]
循环
1、for 循环
for var in item1 item2 ... itemN
do
command1
command2
...
commandN
done
例如:输出/etc下所有的文件
for i in $(ls /etc)
do
echo $i
done
2、while循环
while condition
do
command
done
例如
#!/bin/bash
int=1
while(( $int<=5 ))
do
echo $int
let "int++"
done
3、until循环
until condition
do
command
done
例子:
#!/bin/bash
a=0
until [ ! $a -lt 10 ]
do
echo $a
a=`expr $a + 1`
done
5、case
case 值 in
模式1)
command1
command2
...
commandN
;;
模式2)
command1
command2
...
commandN
;;
esac
跳出循环
1、break
#!/bin/bash
while :
do
echo -n "输入 1 到 5 之间的数字:"
read aNum
case $aNum in
1|2|3|4|5) echo "你输入的数字为 $aNum!"
;;
*) echo "你输入的数字不是 1 到 5 之间的! 游戏结束"
break
;;
esac
done
2、continue
#!/bin/bash
while :
do
echo -n "输入 1 到 5 之间的数字: "
read aNum
case $aNum in
1|2|3|4|5) echo "你输入的数字为 $aNum!"
;;
*) echo "你输入的数字不是 1 到 5 之间的!"
continue
echo "游戏结束"
;;
esac
done
函数
[ function ] funname [()]
{
action;
[return int;]
}
#1、可以带function fun() 定义,也可以直接fun() 定义,不带任何参数。
#2、参数返回,可以显示加:return 返回,如果不加,将以最后一条命令运行结果,作为返回值。 return后跟数值n(0-255
例子1
#!/bin/bash
funWithReturn(){
echo "这个函数会对输入的两个数字进行相加运算..."
echo "输入第一个数字: "
read aNum
echo "输入第二个数字: "
read anotherNum
echo "两个数字分别为 $aNum 和 $anotherNum !"
return $(($aNum+$anotherNum))
}
funWithReturn
echo "输入的两个数字之和为 $? !
例子2
#!/bin/bash
funWithParam(){
echo "第一个参数为 $1 !"
echo "第二个参数为 $2 !"
echo "第十个参数为 $10 !"
echo "第十个参数为 ${10} !"
echo "第十一个参数为 ${11} !"
echo "参数总数有 $# 个!"
echo "作为一个字符串输出所有参数 $* !"
}
funWithParam 1 2 3 4 5 6 7 8 9 34 73
shell中如何进行算术运算:
A=3
B=6
1、let 算术运算表达式
let C=$A+$B
2、$[算术运算表达式]
C=$[$A+$B]
3、$((算术运算表达式))
C=$(($A+$B))
4、expr 算术运算表达式,表达式中各操作数及运算符之间要有空格,而且要使用命令引用
C=`expr $A + $B`
定义脚本退出状态码
exit: 退出脚本
当在脚本运行到某个命令满足退出条件时,使用exit n退出当前脚本。
exit # //如果脚本没有明确定义退出状态码,那么,最后执行的一条命令的退出码即为脚本的退出状态码
exit :退出码不变,即为最后一个命令的退出码
0表示成功(Zero - Success)
非0表示失败(Non-Zero - Failure)
2表示用法不当(Incorrect Usage)
127表示命令没有找到(Command Not Found)
126表示不是可执行的(Not an executable)
>=128 信号产生
测试脚本是否有语法错误:
bash -n 测试脚本是否有语法错误
特殊权限SUID等详解
passwd:s
SUID: 运行某程序时,相应进程的属主是程序文件自身的属主,而不是启动者;
chmod u+s FILE 给文件加s
chmod u-s FILE 给文件减s
如果FILE本身原来就有执行权限,则SUID显示为s;否则显示S;
SGID: 运行某程序时,相应进程的属组是程序文件自身的属组,而不是启动者所属的基本组;
chmod g+s FILE
chmod g-s FILE
develop team, hadoop, hbase, hive 开发团队下三个用户
/tmp/project/
develop
Sticky: 在一个公共目录,每个都可以创建文件,删除自己的文件,但不能删除别人的文件;
chmod o+t DIR
chmod o-t DIR
SUID:SGID:Sticky
000-111
chmod 5755 /backup/test
umask 0022