说明
生产环境中, 固定流程的任务往往会以脚本的形式定时运行
shell语句可以用于在linux中写脚本
变量
一门语言的入门, 最先接触的就是变量
- shell中的变量不需要提前声明, 可以直接使用
name="carney"
# 变量名和等号之间,不能有空格
- 可以使用语句给变量赋值
- 使用双引号调用shell指令
返回的就是该指令运行后显示在控制台上的字符串
myname=`/bin/date -d "1 day ago" +%Y-%m-%d`
hostname=`/bin/hostname`
echo ${myname}:${hostname}
# echo hostname
- 如果是使用.sh文件调用的shell, 使用$1可以获取到在跟随在命令行之后输入的字符串
args=$1
echo ${args}
- 删除变量和readonly:可以将变量声明为
readonly
, 使变量不可修改
注意到, unset和readonly这两个指令, 都不需要在变量前加$
name="carney"
readonly name
name="willson"
# 会报错
unset name
# 也无法删除变量
字符串
name=‘carney’
- 单引号原样输出
- 双引号中可以引用变量
- ${#name}可以获取变量对应字符串的长度
- ${name:1:2}截取输出ar, 比较特殊, 包括前后的
数组
arr=(1 2 3 4 5 6 7)
- 使用
()
定义数组, 使用(空格)分隔元素
- 角标不会越界
- 使用
${#arr[@]}
查看数组长度
运算
- 数学运算应该放在双括号, 或者中括号中
a=$(( 3 + 3 ))
echo $a
b=$[ 3 + 6 ]
echo $b
- 布尔运算和数学运算一样, 而且返回值是0和1
a=$(( 3 == 3 ))
echo $a
# 1
b=$[ 3 == 6 ]
echo $b
# 0
x=3
y=3
c=( $x -eq $y )
echo $c
# 1
# 使用这样的字段, 显著的好处是不需要额外的$表示引用
d=$[ 3 == 4 ]
echo $d
# 0
- 三元运算符
重点关注第4种情况: 虽然echo false的结果为0, 但是0并不代表false
[ 1 == 1 ] && echo 'yes' || echo 'no'
# yes
[ 1 == 2 ] && echo 'yes' || echo 'no'
# no
[ 1 ] && echo 'yes' || echo 'no'
# yes
[ 0 ] && echo 'yes' || echo 'no'
# yes
[ ] && echo 'yes' || echo 'no'
# no
- 与或的逻辑运算
# if后面的[]可以直接进行逻辑运算
name=$1
if [ ${#name} == 0 ]
then
name='carney'
fi
echo ${name}
if [[ $[ 1 == 1 ] && $[ 2 == 3 ] ]]
then
echo 'yes'
else
echo 'no'
fi
# 显示的是yes, 为什么
if [ 0 ]
then
echo 'yes'
fi
# 只有if后面的条件是空的时候, 才会被视为假
if [[ 1 -eq 1 && 2 -eq 3 ]]
then
echo 'yes'
else
echo 'no'
fi
# 使用-eq, -gt, -lt等, 返回的更接近boolean类型, 也可以进行正常的逻辑运算
流程控制
##### 数组 #####
arr=(5 18 26 61 37 12 63 44 58)
##### while循环 #####
i=0
len=${#arr[@]}
echo $len
while (( $i<$len ))
do
i=$[ $i + 1 ]
# 下面的代码是不可用的
# $i=$[ $i + 1 ]
echo ${arr[$i]}
done
##### for循环 #####
for i in 5 8 5 47 7 4 7
do
echo $i
done
for i in 0 1 2 3 4 5 6 7 8
do
echo ${arr[$i]}
done
for i in ${arr[@]}
do
echo $i
done
##### case when #####
a=$1
case $a in
# 如果a的值是1或2或3
1|2|3)
echo 'lo'
# ;;不可以省略, 符合后必须跳出, 不能穿透
;;
# 如果是4或5
1|4|5)
echo 'hi'
;;
# 如果是其它
*)
echo 'wtf'
;;
esac