Shell编程——基础语法

192 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第20天,点击查看活动详情

变量

规则

  • 命令只能使用英文符号,数字和下划线,首个字符不能以数字开头
  • 不能使用bash中的关键字,可用help命令查看保留关键字

定义与使用变量

# 注意,变量名和等号之间不能有空格
variable_name="a"
# 变量名外面的花括号是可选的,加花括号是为了帮助解释器识别变量的边界
echo $variable_name
echo ${variable_name}

# 只读变量
readonly variable_name

# 删除变量,unset 命令不能删除只读变量。
unset variable_name

作用范围

  • 局部变量:在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量
  • 环境变量:所有的程序,包括shell启动的程序,都能访问环境变量
  • shell变量:由shell程序设置的特殊变量。shell变量中有一部分是环境变量,有一部分是局部变量

数据类型

字符串类型

字符串,字符串可以用单引号,也可以用双引号

  • 单引号:任何符号都会原样输出,在单引号中的变量是无效的
  • 双引号里可以有变量,可以出现转义字符

字符串拼接

variable_name="world"
greeting="hello, "${variable_name}" !"
greeting1="hello, ${variable_name} !"

echo $greeting
echo $greeting1

输出结果:

> sh docker_operate.sh
hello, world !
hello, world !

获取字符串长度

variable_name="world"
# 通过#获取字符串长度
echo ${#variable_name}

输出:5

提取子字符串

variable_name="world"
# 输出从1位置开始长度为4的子串的内容
echo ${variable_name:1:4}

输出:orld

解析:字符串第一个字符编号从0开始,[1,4]位置的字符串:orld

查找子字符串

# 查找字符i或o的位置(哪个字符先出现就计算哪个)
expr index ${variable_name} io
# 使用``可以将命令的执行结果进行复制
io_index=`expr index ${variable_name} io`
echo ${io_index}

输出:2 2

数组类型

bash支持一维数组,并且没有限定数组的大小,数组元素的下标由 0 开始编号

# 数组
array_name=("A" "B" "C" "D")
# 单独赋值
array_name[0]="value0"
# 取数组
echo ${array_name[1]}
# 使用 @ 符号或者 * 符号可以获取数组中的所有元素
echo ${array_name[@]}
echo ${array_name[*]}
# 获取数组的长度,与字符串一样,采用 # 符号
echo ${#array_name[@]}
echo ${#array_name[*]}

输出结果:

> sh test.sh
B
value0 B C D
value0 B C D
4
4

基本运算符

算数运算符

原生bash不支持简单的数学运算,但是可以通过其他命令来实现,例如 awk 和 expr,expr 最常用。

expr 是一款表达式计算工具,使用它能完成表达式的求值操作。shell的算术运算规则中包括空格,因此空格的缺少会导致语法错误。

a=10 b=20 重要:表达式中的空格不能少!!

  • 加法 expr $a + $b 结果为30
  • 减法 expr $a - $b 结果为-10
  • 乘法 expr $a \* $b 结果为200
  • 除法 expr $b / $a 结果为2
  • 取余 expr $a % $b 结果为10
  • 赋值 a=$b
  • 相等 [ $a == $b ] 结果为false
  • 不相等 [ $a != $b ] 结果为true

关系运算符

  • 相等 [ $a -eq $b ] 结果为false
  • 不相等 [ $a -ne $b ] 结果为true
  • 大于 [ $a -gt $b ] 结果为false
  • 小于 [ $a -lt $b ] 结果为true
  • 大于等于 [ $a -ge $b ] 结果为false
  • 小于等于 [ $a -le $b ] 结果为true

布尔运算符

  • [ ! false ] 结果为true
  • [ $a -lt 20 -o $b -gt 100 ] a<20或者b大于100
  • [ $a -lt 20 -a $b -gt 100 ] a<20并且b大于100

逻辑运算符

都是短路运算符,即第一个条件失败就不会进行第二个

  • &&
  • ||

控制语句

if

if condition
then
  command1
elif condition
then
  command2
else
  command3
fi

与Java中不一样,shell的流程控制不可为空,如command3不做任何操作,那就不要写else

if condition;then command1;elif condition;then command2;else command3 fi

如果有些命令要写在一行,就必须在命令之间添加 ; 符号

for

for((i=1;i<=5;i++));do
    echo "这是第 $i 次调用";
done;

通常情况下 shell 变量调用需要加 $,但是 for 的 (()) 中不需要

for in

for loop in 1 2 3 4 5
do
  echo "hello"
done
for loop in {1..5};do
  echo "hello"
done

while

循环执行一系列命令直至条件为 false 时停止

int=1
while(( $int<=5 ))
do
  echo $int
  # let 用于执行一个或多个表达式,变量计算中不需要加上 $ 来表示变量
  let "int++"
done

读取文件

while read i;do echo $i;done<test.sh

until

循环执行一系列命令直至条件为 true 时停止

until [ ! $a -lt 10 ]
do
   echo $a
   a=`expr $a + 1`
done

case

case 值 in
模式1)
  command1
  ...
  ;;
模式1)
  command1
  ...
  ;;
*)
  command1
  ...
  ;;
esac

跳出循环

  • break 跳出多有循环
  • continue 跳出当前循环,进行下一次循环

[]和[[]]的区别

a=10
b=20
if [ $a == $b ];then
  echo "a等于b"
# -gt 大于 -lt 小于
elif [ $a -gt $b ];then
  echo "a大于b"
else
  echo "a小于b"
fi
a=20
b=10
# 运算符号需要放在[[]]中
if [[ $a = $b ]];then
  echo "a等于b"
elif [[ $a > $b ]];then
  echo "a大于b"
else
  echo "a小于b"
fi

()()和{}的区别

$()是将括号内命令的执行结果赋值给变量,与``符号功能一样

a=1 b=2
c=`expr $a + $b`
d=$(expr $a + $b)
${}用来做变量替换,一般情况下,$var 与 ${var} 并没有啥不一样。但是用 ${ } 会比较精确的界定变量名称的范围