shell基础

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 教程

posted @ 2020-08-05 19:46  delta1037  阅读(97)  评论(0编辑  收藏  举报