shell 变量
变量的类型
自定义变量
定义变量: 变量名=变量值 变量名必须以字母或下划线开头,区分大小写 ip1=192.168.2.115
引用变量: $变量名 或 ${变量名}
查看变量: echo $变量名 set(所有变量:包括自定义变量和环境变量)
取消变量:unset 变量名
作用范围: 仅在当前shell中有效
环境变量
定义环境变量:
方法一 export back_dir2=/home/backup
方法二 export back_dir1 将自定义变量转换成环境变量
引用环境变量:$变量名 或 ${变量名}
查看环境变量:echo $变量名 env 例如env |grep back_dir2
取消环境变量: unset 变量名
变量作用范围: 在当前shell和子shell有效
位置变量
$1 $2 $3 $4 $5 $6 $7 $8 $9 ${10}
预定义变量
$
* 所有的参数
$@ 所有的参数
$
$$ 当前进程的PID
$? 上一个命令的返回值 0表示成功
$0 返回本脚本的文件名
定义或引用变量时注意事项:
" " 弱引用
' ' 强引用
` ` 命令替换 等价于 $
() 反引号中的shell命令会被先执行
变量的运算
整数运算
1. 方法一:expr
expr 1 + 2
expr $num1 +
$num2 + - \* / %
方法二:
$(())
echo $(($num1+$num2)) + - * / %
echo $((num1+num2))
echo $((5-3*2))
echo $(((5-3)*2))
sum
=$((1+2)); echo $sum
方法三:$
[]
echo $
[5+2
] + - * / %
echo $
[5**2
]
方法四:let
let sum
=2+3
; echo $sum
小数运算
echo "2*4" |bc
echo "2^4" |bc
echo "scale=2;6/4" |bc
字符串操作
条件测试
格式
格式 :
格式1: test 条件表达式
格式2:
[ 条件表达式
]
格式3:
[[ 条件表达式
]]
文件测试 [ 操作符 文件或目录 ]
[ -e
dir|file
] 目录或文件是否存在
[ -d
dir ] 是否为目录
[ -f file
] 是否存在,而且是文件
[ -r file
] 当前用户对该文件是否有读权限
[ -x file
] execute
[ -w file
] write
[ -L file
] link
数值比较 [ 整数1 操作符 整数2 ]
[ 1
-gt 10
] 大于
[ 1
-lt 10
] 小于
[ 1
-eq 10
] 等于
[ 1
-ne 10
] 不等于
[ 1
-ge 10
] 大于等于
[ 1
-le 10
] 小于等于
字符串比较
[root@master ~
]
0
[root@master ~
]
0
使用正则的条件判断
[root@master ~
]
0
判断变量是不是数字:
[root@master ~
]
[root@master ~
]
[root@master ~
]
0
[root@master ~
]
() 子shell中执行
(()) 数值比较,运算 C语言
$
() 命令替换
$
(()) 整数运算
[] 条件测试
[[]] 条件测试,支持正则 =~
$
[] 整数运算
if 语句
单分支结构
if 条件测试
then 命令序列
fi
双分支结构
if 条件测试
then 命令序列
else 命令序列
fi
多分支结构
if 条件测试1
then 命令序列
elif 条件测试2
then 命令序列
elif 条件测试3
then 命令序列
]...
else 命令序列
fi
year
=$(date +%Y)
if [[ $
[$year % 100
] == 0
&& $
[$year % 400
] == 0
]] ;then
echo "ok"
elif [[ $
[$year % 4
] == 0
&& $
[$year % 100
] != 0
]];then
echo "ok"
else
echo "fail"
fi
case 语句
case 变量 in
模式1
)
命令序列1
;;
模式2
)
命令序列2
;;
模式3
)
命令序列3
;;
*)
无匹配后命令序列
esac
#!/bin/bash
if [ -f /etc/init.d/
$1 ] ;then
case $2 in
"start")
/etc/init.d/
$1 start
;;
"stop")
/etc/init.d/
$1 stop
;;
"restart")
/etc/init.d/
$1 restart
;;
"reload")
/etc/init.d/
$1 reload
;;
*
)
echo "usage:/etc/init.d/$1 start|stop|restart|reload";;
esac
else
echo "service name error"
fi
for 循环语句
for 变量名
[ in 取值列表
]
do
循环体
done
#!/bin/bash
for((i=2;i<=100;i++))
do
yn
="y"
for((y=2;y<=$[$i/2];y++))
do
if [ $
[$i %
$y] == 0
];then
yn
="n"
break
fi
done
if [ "$yn" = "y" ];then
echo $i
fi
done
while /until
while 条件测试
do
循环体
done
==当条件测试成立(条件测试为真),执行循环体
二、
until语法结构
until 条件测试
do
循环体
done
==当条件测试成立(条件测试为假),执行循环体
#!/bin/bash
x
=1
while((x<10));do
if [ $
[$x%2
] -eq 0
];then
((x++));
continue
fi
echo $x
((x++));
done
数组
一、普通(索引)数组
定义数组:
方法一: 一次赋一个值 数组名
[下标
]=变量值
array1
[0
]=pear
array1
[1
]=apple
[root@master ~
]
[root@master ~
]
方法二: 一次赋多个值
[root@master ~
]
[root@master ~
]
[root@master ~
]
[root@master ~
]
查看数组:
declare -a array1
='([0]="pear" [1]="apple" [2]="orange" [3]="peach")'
declare -a array2
='([0]="tom" [1]="jack" [2]="alice")'
访问数组元数:
[root@master ~
]
[root@master ~
]
[root@master ~
]
[root@master ~
]
[root@master ~
]
[root@master ~
]
遍历数组: 方法一: 通过数组元数的个数进行遍历 方法二: 通过数组元数的索引进行遍历
二、关联数组
定义关联数组(必须显式声明,隐式声明会出问题):
申明关联数组变量
方法一: 一次赋一个值
数组名
[索引
]=变量值
ass_array1
[index1
]=pear
方法二: 一次赋多个值
查看数组:
declare -A ass_array1
='([index4]="peach" [index1]="pear" [index2]="apple" [index3]="orange" )'
declare -A ass_array2
='([index4]="bash shell" [index1]="tom" [index2]="jack" [index3]="alice" )'
访问数组元数:
函数
格式
方法一:
函数名
() {
函数要实现的功能代码
}
方法二:
function 函数名
{
函数要实现的功能代码
}
调用函数
函数名
函数名 参数1 参数2
注意:bash shell支持函数传递位置参数
例如:
function test1
(){
sum
=$
[$1+
$2]
}
test1 3 4
echo $sum
函数返回值
(bash shell支持使用return 返回值,返回值存储在变量
$?中
)
例如:
function test2
(){
return 3
}
test2
echo $?
shell相互调用
source script_file_name
. script_file_name