1、shell数组的定义以及使用
#!/bin/bash
echo "----------------Shell 数组-----------------"
# shell数组定义形式array_name=(value1 value2 . . . . . . valuen);读取数组元素array_name[index](index为数组下标)
:<<EOF
定义数组有两种形式my_array={value1 value2 . . . . . . valuen}
my_array={value1
value2
value3
.
.
valuen
}
EOF
my_array=(A
B
"C"
D
) # 定义数组两个元素之间用空格隔开,不能写逗号
echo "--------输出每一个数组元素----------"
echo "数组第一个元素:${my_array[0]}"
echo "数组第一个元素:${my_array[1]}"
echo "数组第一个元素:${my_array[2]}"
echo "数组第一个元素:${my_array[3]}"
echo "--------输出数组中所有的元素--------"
echo "数组元素为:${my_array[*]}"
echo "数组元素为:${my_array[@]}"
echo "--------获取数组的长度-------------"
echo "数组元素的长度为:${#my_array[*]}"
echo "数组元素的长度为:${#my_array[@]}"
2、shell运算符
#!/bin/bash
echo "-----------------Shell运算符------------------"
:<<EOF
Shell关系运算符有:算数运算符、关系运算符、布尔运算符、字符串运算符、文件测试运算符
主要通过awk、expr。常用expr运算
EOF
echo "-------------算术运算符---------------"
val=`expr 2 + 2` #注意表达式和运算符之间有空格 '`'为ESC键下面的键
echo "两数之和为:${val} \n"
a=10 # 定义局部变量
b=20 # 定义局部变量
add_val=`expr ${a} + ${b}` # 加法
echo "a + b的和为:${add_val}" # a + b 的和为:30
sub_val=`expr ${a} - ${b}` # 减法
echo "a - b的差为:${sub_var}" # a - b 的差为:30
mul_val=`expr ${a} \* ${b}` # 乘法
echo "a * b的积为:${mul_val}" # a * b 的积为:30
div_val=`expr ${b} / ${a}` # 除法
echo "b / a的商为:${div_val}" # a / b 的商为:30
cmp_val=`expr ${b} % ${a}` # 取余
echo "b % a的余数为:${cmp_val}" # b % a 的余数为:30
echo "-----------shell判断是两个数是否相等----------------"
if [ ${a} == ${b} ] # 判断两个数相等
then
echo "a等于b"
fi
if [ ${a} != ${b} ] # 判断两个数不想等
then
echo "a不等于b" # a不等于b
fi
:<<EOF
乘号(*)前边必须加反斜杠(\)才能实现相乘
if...then..fi为shell的条件语句
EOF
echo "---------------关系运算符----------------"
# 关系运算符只支持数字,不支持字符串,除非字符串是数字
:<<EOF
-eq 检测两个数字是否相等,相等返回true,不等返回false
-ne 检测两个数是否不想等,不想等返回true,相等返回false
-gt 检测左边的数大于右边的数,如果是,返回true,不是返回true
-lt 检测左边的数是否小于右边的数,如果是,返回true,不是返回false
-ge 检测左边的数是否大于等于右边的数,如果是,返回true,不是返回false
-le 检测左边的数是否小于等于右边的数,如果是,返回true,不是返回false
EOF
echo "---------------案例演示----------------"
# -eq
if [ ${a} -eq ${b} ]
then
echo "${a} -eq ${b} :a等于b"
else
echo "${a} -eq ${b} :a不等于b"
fi
# -ne
if [ ${a} -ne ${b} ]
then
echo "${a} -ne ${b} :a不等于b"
else
echo "${a} -ne ${b} :a等于b"
fi
# -gt
if [ ${a} -gt ${b} ]
then
echo "${a} -gt ${b} :a大于b"
else
echo "${a} -gt ${b} :a不大于b"
fi
# -lt
if [ ${a} -lt ${b} ]
then
echo "${a} -lt ${b} :a小于b"
else
echo "${a} -lt ${b} :a不小于b"
fi
# -ge
if [ ${a} -ge ${b} ]
then
echo "${a} -ge ${b} :a大于或等于b"
else
echo "${a} -eq ${b} :a小于b"
fi
# -le
if [ ${a} -le ${b} ]
then
echo "${a} -le ${b} :a小于或等于b"
else
echo "${a} -le ${b} :a大于b"
fi
echo "----------------布尔运算------------------"
:<<EOF
! 非运算,表达式为true则返回false,否则返回true
-o 或运算,有一个表达式为true,则返回true
-a 与运算,两个表达式都为true才返回true
EOF
# ! 非运算
if [ ${a} != ${b} ]
then
echo "$a != $b:a不等于b"
else
echo "$a == $b:a等于bif [ ${a} -lt 100 -a $b -gt 15 ]"
fi
# 与运算
if [ ${a} -lt 100 -a ${b} -gt 15 ]
then
echo "$a小于 100 或 $b 大于15: 返回true"
else
echo "$a小于 100 或 $b 大于15: 返回false"
fi
# 或运算
if [ ${a} -lt 100 -o ${b} -gt 100 ]
then
echo "$a小于 100 或 $b 大于100: 返回true"
else
echo "$a小于 100 或 $b 大于100: 返回false"
fi
if [ ${a} -lt 5 -o ${b} -gt 100 ]
then
echo "$a小于 5 或 $b 大于100: 返回true"
else
echo "$a小于 5 或 $b 大于100: 返回false"
fi
echo "--------------逻辑运算-------------------"
:<<EOF
&& 逻辑的and
|| 逻辑的or
EOF
if [[ ${a} -lt 100 && ${b} -gt 100 ]]
then
echo "返回false"
else
echo "返回true"
fi
if [[ ${a} -lt 100 || ${b} -gt 100 ]]
then
echo "返回true"
else
echo "返回false"
fi
echo "-------------字符串运算-------------------"
:<<EOF
# = 检测两个字符串是否相等,相等返回true
# != 检测两个字符串是否相等,不相等返回true
# -z 检测字符串的长度是否为0,为0返回true
# -n 检测字符串的长度是否不为0,不为0返回true
# $ 检测字符串是否为空,不为空返回true
EOF
c="abcd"
d="efgh"
if [ ${c} = ${d} ]
then
echo "${a} = ${b}:a 等于 b"
else
echo "${a} = ${b}:a 不等于 b"
fi
if [ ${c} != ${d} ]
then
echo "${c} = ${d}:c 不等于 d"
else
echo "${c} = ${d}:c 等于 d"
fi
if [ -z ${c} ]
then
echo "-z ${c}:字符串长度为0"
else
echo "-z ${c}:字符串的长度不为0"
fi
if [ -n ${d} ]
then
echo "-n ${d}:字符串长度不为0"
else
echo "-n ${d}:字符串的长度为0"
fi
if [ ${c} ]
then
echo "${c}:字符串不为空"
else
echo "${c}:字符串为空"
fi
echo "-------------文件测试运算符-------------"
:<<EOF
-b file 检测文件是否是块设备文件,如果是,返回true
-c file 检测文件是否是字符设备文件,如果是,返回true
-d file 检测文件是否是目录,如果是,则返回true
-f file 检测文件是否是普通文件(既不是目录,也不是设备文件),如果是返回true,不是返回false
-g file 检测文件是否设置了SGID位,如果是,返回true,不是返回false
-k file 检测文件是否设置了粘着位(StickyBit),如果是:返回true,不是:返回false
-p file 检测文件是否是有名管道,如果是,则返回true,不是,返回false
-u file 检测文件是否设置了SUID位,如果是:返回true,不是:返回false
-r file 检测文件是否可读,如果是:返回true,不是:返回false
-w file 检测文件是否可写入,如果是:返回true,不是:返回false
-x file 检测文件是否是可执行,如果是:返回true,不是:返回false
-s file 检测文件是否为空(文件大小是否大于0),不为空返回true
-e file 检测文件(包含目录)是否存在,如果是:返回true,不是:返回false
-S 判断某文件是否soket
-L 检测文件是否存在并且是一个符号链接
EOF
file="/usr/local/shell/s1.sh"
# 检测是否可读
if [ -r ${file} ]
then
echo "文件可读"
else
echo "文件不可读"
fi
# 检测是否可写
if [ -w ${file} ]
then
echo "文件可写"
else
echo ”文件不可写“
fi
# 检测是否可执行
if [ -x ${file} ]
then
echo "文件可以执行"
else
echo "文件不可以执行"
fi
# 检测文件是否是普通文件
if [ -f ${file} ]
then
echo "文件为普通文件"
else
echo "文件为特殊文件"
fi
# 检测文件是否是目录
if [ -d ${file} ]
then
echo "文件不为空"
else
echo "文件为空"
fi
# 检测文件是否存在
if [ -e ${file} ]
then
echo "文件存在"
else
echo "文件不存在"
fi