shell基础
变量
# 使用变量,建议方式
${var}
# 在变量名var后是空格时才可用如下方式
$var
# 设定只读变量
declare -r var_name
readonly var_name
# 删除变量
uset var_name
字符串变量
# 字符串的定义
var_string="hello world"
# 字符串的长度计算
${#var_string}
# 字符串拼接
var_string_new="${var_string} new string"
######## 字符串操作 ########
# 根据起始和截取长度截取字符串
${string_var:start_index:length}
变量赋值
# 除了显式赋值,也可以将命令的结果存入到变量,如下就是将`ls /etc`的结果存到到了file_array
file_array=$( ls /etc )
# 也可以使用` 命令 `方式
file_array=` ls /etc `
# 应用:循环访问文件
for file in $( ls /etc )
do
# do something
done
数组变量
# 数组的定义
array_var=(val0 val1 val2)
# 单独定义每个元素
array_var[0]=val0
array_var[1]=val1
# 获取所有元素
${array_var[@]}
# 获取数组的长度/元素个数
${#array_var[@]}
${#array_var[*]}
# 获取单个元素长度
${#array_var[n]}
运算符
算数运算符
+、-、*、/,%
借助expr
进行计算,例如expr $var1 + $var2
=
赋值==
数字比较相等返回true,[ $var1 == $var2 ]
!=
数字比较不相等返回true,[ $var1 != $var2 ]
关系运算符
关系运算符只用于比较数字之间的关系,不支持字符串,除非字符串的值是数字
-eq
数字相等返回true,[ $var1 -eq $var2 ]
=>==
-ne
数字不相等返回true,[ $var1 -nq $var2 ]
=>!=
-gt
左边大于右边返回true,[ $var1 -gt $var2 ]
=>>
-lt
左边小于右边返回true,[ $var1 -lt $var2 ]
=><
-ge
左边大于等于右边返回true,[ $var1 -ge $var2 ]
=>>=
-le
左边小于等于右边返回true,[ $var1 -le $var2 ]
=><=
布尔运算符
设var1=10,var2=20
!
非运算,表达式为false,返回true,[ ! false ]
返回true-o
或运算,有一个表达式为true就为true,[ $var1 -lt 20 -o $var1 -gt 100 ]
返回true-a
与运算,所有表达式为true才是true,[ $var1 -lt 20 -a $var1 -gt 100 ]
返回false
逻辑运算符
- && :逻辑的AND
- || :逻辑的OR
# 注意需要两个嵌套的中括号
if [[ ${var1} == 0 && ${var2} == 0 ]];then
// do something
fi
字符串运算符
设var1="abc",var2="efg"
=
检测字符串相等返回true,[ $var1 = $var2 ]
返回false!=
检测字符串不相等返回true,[ $var1 != $var2 ]
返回true-z
检测字符串长度为0返回true,[ -z $var1 ]
返回false-n
检测字符串长度不为0返回true,[ -n $var1 ]
返回true$
检测字符串不为空返回true,[ $var1 ]
返回true
########## 字符串为空和字符串长度的运算测试 ##########
#!/bin/bash
var1=
var2=""
if [ -z $var1 ];then
echo "var1 字符串长度为0"
else
echo "var1 字符串长度不为0"
fi
if [ -z $var2 ];then
echo "var2 字符串长度为0"
else
echo "var2 字符串长度不为0"
fi
if [ -z $no_exits ];then
echo "no_exits 字符串长度为0"
else
echo "no_exits 字符串长度不为0"
fi
if [ $var1 ];then
echo "var1 字符串不为空"
else
echo "var1 字符串为空"
fi
if [ $var2 ];then
echo "var2 字符串不为空"
else
echo "var2 字符串为空"
fi
if [ $no_exits ];then
echo "no_exits 字符串不为空"
else
echo "no_exits 字符串为空"
fi
########## 输出 ##########
var1 字符串长度为0
var2 字符串长度为0
no_exits 字符串长度为0
var1 字符串为空
var2 字符串为空
no_exits 字符串为空
########## 结论 ##########
字符串长度和字符串是否为空的运算*好像*是一致的,他们有没有区别呢?
文件测试运算符
使用方法:<operator> file_name
operator
-e
文件是否存在-r
文件可读检测-w
文件可写检测-x
文件可执行检测-d
目录检测-f
普通文件检测(既不是目录,也不是设备文件)-b
块设备检测-c
字符设备检测-p
有名管道检测-s
文件大小是否为0-S
文件是否是socket连接-L
文件是否存在并且是一个符号链接-g
文件SGID位检测-u
文件SUID位检测-k
文件粘滞位(Sticky Bit)检测
流程控制
参考文章
【1】Shell 教程