持续创作,加速成长!这是我参与「掘金日新计划 · 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} 并没有啥不一样。但是用 ${ } 会比较精确的界定变量名称的范围