Shell脚本笔记

前言

查看当前窗口是什么shell

1
echo $SHELL

shell脚本可以一次性执行多条命令,通常脚本文件以.sh结尾,这称为批处理。

注释用#表示,但注意第一行的#!/bin/bash表示以后面的解释器解释执行;

执行方式:

  1. 作为可执行文件

    1
    2
    chmod +x name.sh # 加上可执行权限
    ./name.sh # 执行脚本
  2. 作为解释器参数

    1
    /bin/bash name.sh
  3. 其它,当前窗口执行,不产生子进程;

    1
    2
    source name.sh  # source也常用于加载配置文件
    . name.sh # 点号后面有个空格

一般使用第一种,作为可执行文件执行脚本。

语法

变量

shell变量分为局部变量和环境变量,局部变量一般小写,环境变量是大写;局部变量只有在当前shell实例中有效,所以从shell启动的程序(子进程)不能访问到局部变量,环境变量都可以被访问;子进程修改环境变量也不会影响父进程;

  1. 定义变量,注意,等号两边不能有空格;

    1
    var_name=zyue
  2. 使用变量,加上美元符合$;

    1
    2
    echo $var_name	 # 输出:zyue
    echo ${var_name} # 加大括号,建议使用
  3. 变量值是字符串时;

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    # 加引号来包含空格

    # 单引号里面字符都会原样输出
    var_info='my name is ${var_name}'
    echo var_info # 输出:my name is ${var_name}

    # 双引号里面可以有变量,还可以有转义字符
    var_info="my name is ${var_name}"
    echo var_info # 输出:my name is zyue

    # 获取字符串长度
    string="abcd"
    echo ${#string} #输出:4
  4. 其它操作;

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    # 只读变量,就不能更改了
    readonly var_name

    # 局部变量
    local var_name=zyue

    # 删除变量
    unset var_name

    # 将局部变量升级为全局变量
    export var_name
  5. 一维数组;

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    # 不支持多维数组,shell只支持一维数组

    # 定义,还有其它形式
    array_name=(value0 value1 value2 value3)

    # 读取 ${数组名[下标]}
    valuen=${array_name[n]}

    # 使用 @ 符号可以获取数组中的所有元素
    echo ${array_name[@]}

    # 取得数组元素的个数
    length=${#array_name[@]}

    # 取得数组单个元素的长度
    len=${#array_name[n]}

参数

可以给待执行的shell脚本传递参数,脚本内获取参数的格式为:$n,n 代表一个数字;

$0 为shell脚本的文件名;

$1 为执行脚本的第一个参数,以此类推;

$# 是传递的参数个数;

$?表示执行脚本后的退出状态,0表示执行成功,其它值是有错误;

$$ 表示当前进程号;

条件分支

自己看示例,和普通语言有些不同;

方括号[]两边的内测必须有空格分隔开!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
if [ 条件 ]
then
此处执行某操作
fi

# ===============================

if [ 条件 ]
then
此处执行某操作
else
此处执行某操作
fi

# ===============================

if [ 条件 ]
then
此处执行某操作
elif [ 条件 ]
then
此处执行某操作
else
此处执行某操作
fi

case分支

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#!/bin/bash

echo "is it morning?please answer yes or no"
read YES_OR_NO

case "$YES_OR_NO" in
yes|y|Yes|YES)
echo "good morning"
;; #相当于break
[nN][oO])
echo "good afternoon"
;;
*)
echo "not recognized"
;;
esac #结束

循环语句

例一:

1
2
3
4
5
6
#!/bin/bash

for fruit in apple banana pear
do
echo "I like $fruit"
done

例二:

1
2
3
4
5
6
7
8
#!/bin/bash

sum=0
for i in {1..100}
do
sum=$[sum+i]
done
echo $sum

运算符

  1. 算术运算符,需要借助expr命令;

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    # 普通算术代换,无空格 4种写法
    var=88
    echo $[var+1]
    echo $((var+1))
    echo $[$var+1]
    echo $(($var+1))

    # 使用变量进行算术计算
    a=10
    b=20

    val=`expr $a + $b`
    echo "a + b : $val"

    val=`expr $a \* $b` # 需要转义,因为*也有通配符的含义
    echo "a * b : $val"

    val=`expr $b / $a`
    echo "b / a : $val"
  2. 关系运算符,只支持数字

    运算符 说明 举例
    -eq 检测两个数是否相等,相等返回 true。 [ $a -eq $b ] 返回 false。
    -ne 检测两个数是否不相等,不相等返回 true。 [ $a -ne $b ] 返回 true。
    -gt 检测左边的数是否大于右边的,如果是,则返回 true。 [ $a -gt $b ] 返回 false。
    -lt 检测左边的数是否小于右边的,如果是,则返回 true。 [ $a -lt $b ] 返回 true。
    -ge 检测左边的数是否大于等于右边的,如果是,则返回 true。 [ $a -ge $b ] 返回 false。
    -le 检测左边的数是否小于等于右边的,如果是,则返回 true。 [ $a -le $b ] 返回 true。
  3. 布尔运算符

    运算符 说明 举例
    ! 非运算,表达式为 true 则返回 false,否则返回 true。 [ ! false ] 返回 true。
    -o 或运算,有一个表达式为 true 则返回 true。 [ $a -lt 20 -o $b -gt 100 ] 返回 true。
    -a 与运算,两个表达式都为 true 才返回 true。 [ $a -lt 20 -a $b -gt 100 ] 返回 false。
  4. 逻辑运算符

    运算符 说明 举例
    && 逻辑的 AND [[ $a -lt 100 && $b -gt 100 ]] 返回 false
    || 逻辑的 OR [[ $a -lt 100 || $b -gt 100 ]] 返回 true
  5. 字符串运算符

    运算符 说明 举例
    = 检测两个字符串是否相等,相等返回 true。 [ $a = $b ] 返回 false。
    != 检测两个字符串是否相等,不相等返回 true。 [ $a != $b ] 返回 true。
    -z 检测字符串长度是否为0,为0返回 true。 [ -z $a ] 返回 false。
    -n 检测字符串长度是否为0,不为0返回 true。 [ -n “$a” ] 返回 true。
    $ 检测字符串是否为空,不为空返回 true。 [ $a ] 返回 true。

函数

只能返回int类型的值;

1
2
3
4
5
6
7
8
9
#!/bin/bash		

function f() #function 或者 () 可以忽略其中一个,但不能同时不写
{
echo "hello, world"
return 1
}
f
echo $?

参考资料

http://note.alvinhtml.com/developer/shell.html

https://gerenblog.top/fhgfh/


Shell脚本笔记
http://example.com/2022/08/20/Shell脚本笔记/
作者
ZYUE
发布于
2022年8月20日
更新于
2022年9月8日
许可协议