LinuxSell部分

本文最后更新于:2023年2月4日 下午

Shell初识

  1. Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。Shell 既是一种命令语言,又是一种程序设计语言。

  2. Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务。

  3. 在一般情况下,人们并不区分 Bourne Shell 和 Bourne Again Shell,所以,像 #!/bin/sh,它同样也可以改为 #!/bin/bash

    #! 告诉系统其后路径所指定的程序即是解释此脚本文件的 Shell 程序。

运行shell的两种方式

  1. 作为可执行程序
  2. 作为解释器参数

编写步骤

  1. 创建 .sh文件 --> touch test.sh
  2. 赋予可执行权限 --> chmod +x test.sh
  3. 编辑脚本 --> vim test.sh
  4. 执行脚本 --> ./ test.sh

shell 变量

  1. 命名规范

    • 变量名和等号之间不能有空格.

    • 命名只能使用英文字母,数字和下划线,首个字符不能以数字开头。

    • 中间不能有空格,可以使用下划线 _

    • 不能使用标点符号。

    • 变量声明等号左右没有空格

    • 不能使用bash里的关键字(可用help命令查看保留关键字)。

      1
      2
      name = "张三"
      age = 16
  2. 使用变量

    • 使用一个定义过的变量,只要在变量名前面加美元符号即可

      1
      2
      3
      name = "张三"
      echo $name
      echo ${name}
    • 变量名外面的花括号是可选的,加不加都行,加花括号是为了帮助解释器识别变量的边界(推荐添加)

      1
      2
      3
      age =16
      echo $age
      echo ${age}years

      注意 : 如果不给age变量加花括号,写成echo $ageyears,解释器就会把$ageyears当成一个变量(其值为空),代码执行结果就不是我们期望的样子

  3. 只读变量(readonly )

    • 使用 readonly 命令可以将变量定义为只读变量,只读变量的值不能被改变。

      1
      2
      myid = 1000
      readonly myid
  4. 删除变量 (unset)

    • 使用 unset 命令可以删除变量

      1
      2
      3
      4
      5
      6
      7
      #!/bin/sh

      name = "张三"

      unset name

      echo name #没有任何输出
  5. 变量类型

    • 局部变量 局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量。
    • 环境变量 所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行。必要的时候shell脚本也可以定义环境变量。
    • shell变量 shell变量是由shell程序设置的特殊变量。shell变量中有一部分是环境变量,有一部分是局部变量,这些变量保证了shell的正常运行

shell 字符串

  • 单引号

    1
    str = 'aaa bbb ccc'

    特点 :

    • 单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的
    • 单引号字串中不能出现单独一个的单引号(对单引号使用转义符后也不行),但可成对出现,作为字符串拼接使用。
  • 双引号

    1
    2
    name = "张三"
    str = "xingming : ${name} , 年龄\" 16岁 \" , 性别 : 男"

    特点:

    • 双引号里可以有变量
    • 双引号里可以出现转义字符
  • 拼接字符串

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

    name = "张三"

    # 双引号
    str1 = "你好 , ${name} !"
    str2 = "你好 , "$name" !"

    echo $str1 $str2

    # 单引号
    str3 = '你好 , '$name' !'
    str4 = '你好 , ${name}' !'

    echo $str3 $str4



  • 获取字符串长度

    1
    2
    string = "abcd"
    echo ${#string} # 结果为4
  • 提取字符串 (第一个字符的索引值为 0)

    1
    2
    string = "abcd"
    echo ${string:1:3} # 输出 bcd
  • 查找字符串 (以上脚本中 ` 是反引号,而不是单引号 ’ )

    1
    2
    3
    string = "abcd abcd abcd"
    echo `expr index "${string}" cd` # 输出2
    # 谁先出现 , 输出谁的下标, 默认从 0 开始

shell数组

  • bash支持一维数组(不支持多维数组),并且没有限定数组的大小

  • 定义数组

    • 用括号来表示数组,数组元素用"空格"符号分割开

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      arr_name=("张三" "李四" "王五" "赵六")

      # 或者
      arr_age=(
      12
      13
      14
      15
      41
      31
      21
      )

      # 还可以
      names[0]="张三"
      names[1]="李四"
  • 读取数组 ${数组名[下标]}

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    arr_age=(
    12
    13
    14
    15
    41
    31
    21
    )

    echo ${arr_age[5]} # 获取下标为5的
    echo ${arr_age[@]} # 获取所有
  • 读取数组的长度

    • 获取数组长度的方法与获取字符串长度的方法相同

      1
      2
      3
      4
      5
      6
      7
      8
      arr_name=("张三" "李四" "王五" "赵六")

      #获取数组中单个元素的长度
      echo ${#arr_name[0]}

      # 获取数组的长度
      echo ${#arr_name[*]}

shell参数传递(位置参数)

参数处理 说明
$# 传递到脚本的参数个数
$* 以一个单字符串显示所有向脚本传递的参数。 如"$*“用「”」括起来的情况、以"$1 $2 … $n"的形式输出所有参数。
$$ 脚本运行的当前进程ID号
$! 后台运行的最后一个进程的ID号
$@ 相同,但是使用时加引号,并在引号中返回每个参数。如"*相同,但是使用时加引号,并在引号中返回每个参数。 如"@“用「”」括起来的情况、以"$1" “2""2" … "n” 的形式输出所有参数。
$- 显示Shell使用的当前选项,与set命令功能相同。
$? 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。
1
2
3
4
5
6
#!/bin/sh

echo "一共传递进$#个参数"
echo "进程ID为 : $$"
echo "第一个参数是 : $1"
echo "参数列表: $*"

shell基本运算符

  • 种类

    • 算数运算符
    • 关系运算符
    • 布尔运算符
    • 字符串运算符
    • 文件测试运算符
  • 算术运算符

    下表列出了常用的算术运算符,假定变量 a 为 10,变量 b 为 20:

    运算符 说明 举例
    + 加法 expr $a + $b 结果为 30。
    - 减法 expr $a - $b 结果为 -10。
    * 乘法 expr $a \* $b 结果为 200。
    / 除法 expr $b / $a 结果为 2。
    % 取余 expr $b % $a 结果为 0。
    = 赋值 a=$b 把变量 b 的值赋给 a。
    == 相等。用于比较两个数字,相同则返回 true。 [ $a == $b ] 返回 false。
    != 不相等。用于比较两个数字,不相同则返回 true。 [ $a != $b ] 返回 true。

    **注意:**1. 条件表达式要放在方括号之间,并且要有空格,例如: [a==a==b] 是错误的,必须写成 [ $a == $b ]

    ​ 2. 加减乘除 --> expr 之间要有空格

    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42

    #!/bin/sh

    a=10
    b=20

    #
    res=`expr $a + $b`
    echo "a + b = ${res}"
    #
    res=`expr $a - $b`
    echo "a - b = ${res}"
    #
    res=`expr $a \* $b`
    echo "a * b = ${res}"
    #
    res=`expr $b / $a`
    echo "b / a = ${res}"
    # 取余
    res=`expr $a % $b`
    echo "a % b = ${res}"
    # 赋值
    res=`expr a = $b`
    echo "a = b --> ${res}"
    #判断 == !=

    if [ $a != $b ]
    then
    echo "a 不等于 b"
    elif []
    then
    echo ""
    else
    echo ""
    fi

    if [ $a == $b ]
    then
    echo "a 等于 b"

    fi

  • 关系运算符

    关系运算符只支持数字,不支持字符串,除非字符串的值是数字。

    下表列出了常用的关系运算符,假定变量 a 为 10,变量 b 为 20:

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

#!/bin/sh

a=10
b=20

if [ $A -eq $b ]
then
echo "-eq检测两个数是否相等 , 相等返回true"
fi

if [ $a -ne $b ]
then
echo "-ne 检测两个数是否不相等 , 不相等返回true(取反)"
fi

  • 布尔运算符

    下表列出了常用的布尔运算符,假定变量 a 为 10,变量 b 为 20:

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

    以下介绍 Shell 的逻辑运算符,假定变量 a 为 10,变量 b 为 20:

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

​ 语法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

[[ 第一个关系表达式 && 第二个关系表达式 ]]


#test
echo "笔试成绩"
read a
echo "机试成绩"
read b

if [[ $a -ge 60 && $b -ge 60 ]]
then
echo "成绩合格"
else
echo "成绩不合格!!!"
fi




  • 字符串运算符

    下表列出了常用的字符串运算符,假定变量 a 为 “abc”,变量 b 为 “efg”:

    运算符 说明 举例
    = 检测两个字符串是否相等,相等返回 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。
  • 文件测试运算符

    文件测试运算符用于检测 Unix 文件的各种属性。

    属性检测描述如下:

    操作符 说明 举例
    -b file 检测文件是否是块设备文件,如果是,则返回 true。 [ -b $file ] 返回 false。
    -c file 检测文件是否是字符设备文件,如果是,则返回 true。 [ -c $file ] 返回 false。
    -d file 检测文件是否是目录,如果是,则返回 true。 [ -d $file ] 返回 false。
    -f file 检测文件是否是普通文件(既不是目录,也不是设备文件),如果是,则返回 true。 [ -f $file ] 返回 true。
    -g file 检测文件是否设置了 SGID 位,如果是,则返回 true。 [ -g $file ] 返回 false。
    -k file 检测文件是否设置了粘着位(Sticky Bit),如果是,则返回 true。 [ -k $file ] 返回 false。
    -p file 检测文件是否是有名管道,如果是,则返回 true。 [ -p $file ] 返回 false。
    -u file 检测文件是否设置了 SUID 位,如果是,则返回 true。 [ -u $file ] 返回 false。
    -r file 检测文件是否可读,如果是,则返回 true。 [ -r $file ] 返回 true。
    -w file 检测文件是否可写,如果是,则返回 true。 [ -w $file ] 返回 true。
    -x file 检测文件是否可执行,如果是,则返回 true。 [ -x $file ] 返回 true。
    -s file 检测文件是否为空(文件大小是否大于0),不为空返回 true。 [ -s $file ] 返回 true。
    -e file 检测文件(包括目录)是否存在,如果是,则返回 true。 [ -e $file ] 返回 true。

循环

​ 对一个群体 , 有相同操作的时候,使用循环

  • for循环

    • //for
      
      for((初始化语句A ; 判断语句B ; 控制语句C))
      do
      //条件成立 , 执行语句
      done
      
      res=0
      for (( i=1 ; i <= 100 ; i++ ));do
      if [ $i % 2 == 0 ]
      then
      echo `expr $res + i`
      
      #增强for循环
      for 
      
      
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14

      - 增强`for`

      - `for var in 集合`

      - `while`循环

      - ```shell
      i=1
      while ( i <= 100 )
      do
      echo $i
      ((i++))
      done
  • examples

    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    #!/bin/bash
    for (( i = 1; i <= 100; i++ ))
    do
    echo $i
    done

    echo "--------------------------"

    a=0
    for (( i = 1; i <= 100; i++ ))
    do
    a=`expr $a + $i`
    done
    echo "所有数的和为:" $a


    echo "---------------------------"

    for (( i = 0; i <= 100; i = i+2 ))
    do
    echo "偶数为:"$i
    a=`expr $a + $i`
    done
    echo "偶数和为:"$a


    echo "-----------------------------"
    for (( i = 1; i<=100; i = i+2 ))
    do
    echo "奇数为:"$i
    a=`expr $a + $i`
    done
    echo "奇数和为:"$a


    echo "---------------------------"
    list="a b c d e f g h i j k l m n o p q r s t u v w x y z"
    for var in "a b c d e f g h i j k l m n o p q r s t u v w x y z"
    do
    echo $var
    done


    echo "-----------------------------"

    i=1
    while [ $i -le 100 ]
    do
    echo $i
    i=`expr $i + 1`
    done

    echo "---------------------------"

    i=1
    b=0
    while [ $i -le 100 ]
    do
    # i=`expr $i + 1`
    b=`expr $i + $b`
    ((i++))
    done
    echo $b





LinuxSell部分
http://example.com/2023/01/25/LinuxSell部分/
作者
F434
发布于
2023年1月25日
更新于
2023年2月4日
许可协议