shell script语法

Xiao Qiang Lv4

Shell基本操作

  • 什么Shell,什么是Shell脚本。Shell是 C 语言编写的程序,它是用户使用 Linux 的桥梁。Shell 既是一种命令语言,又是一种程序设计语言。Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务。通过登录命令,用户可以登录到linux中。在macOS上直接使用login。如果要切换用户,运行sudo -s -u username。而Shell 脚本(shell script),是一种为 shell 编写的脚本程序
  • 运行 shell
    • 创建文件 *.sh,运行chmod 755 *.sh是文件可执行,再运行./*.sh或者/bin/sh or bash *.sh就可以运行脚本
    • tip: 为什么要在.sh文件中定义 #!/bin/sh#!/bin/bash,因为两者支持的语法有一些稍微的不同,有哪些不同呢?

基础语法

  • 变量

    • 命名规则,和大多数的编程语言一致,作为入门的我没有发现有什么特别的地方

    • 使用变量,${变量名称},左右花括号帮助shell识别变量的范围,如果想要在字符串中拼接变量,当前字符串需要用双引号,否则变量引用也会被当做是字符串的一部分,但是单引号如果成对使用就可以使用变量

      1
      2
      3
      4
      5
      6
      > echo "current user ${USERNAME}"
      current user zengqiangfang
      > echo 'current user ${USERNAME}'
      current user ${USERNAME}
      > echo 'current user '${USERNAME}'
      current user zengqiangfang
    • 变量类型

      • 局部变量,定义在当前shell环境中,shell控制台或者shell代码都可
      • 环境变量,运行env,可以看到当前环境的所有变量
      • shell变量,暂时么有发现使用场景
  • 字符串操作

    • 获取字符串的长度

      1
      ${#string}, ${#string[0]}
    • 冒号可以用来分割字符串

    • 字符串查找使用 expr eg?

  • 数组操作

    • 定义:array_name=(v1 v2 …)

    • 使用下标获取数组的元素

    • 获取数组的长度

      1
      ${#array_name[@]} 或者 ${#array_name[*]}
    • 获取当前数组的所有元素

      1
      ${array_name[@]} 或者 ${array_name[*]}
    • 获取当前数组的所有key

      1
      ${!array_name[@]} 或者 ${!array_name[*]}
    • 声明关联数组 declare -A array,这样声明的数组的key可以是字符,数字,或者任意字符串,eg: declare -A array=(["a1"]="a1")

  • 参数

    • 传递参数,**$+数字**,数字几代表的是第几个参数,这里要注意的是,$0表示的是当前文件的名称
    • 一些特殊意义的符号,$#输出参数的个数,$@一个一个的输出参数,$*以字符串的形式输出参数,$?检测当前程序是否报错,无错输出0
  • 基本运算符

    • bash不支持简单的数学运算符,但是可以通过其他的bash命令来完成,在shell中提供了两类工具awkexprexpr更常用,对于expr中的表达式以及其其自身用需要使用反引号”`“,”`expr 2 + 2`“
    • 使用关系运算符时,被比较的两个变量需要距离左右括号一个空格,不能紧贴[]eg: [ 1 -eq 2 ]
    • 字符串运算符,-z表示检测当前字符串长度是否为0,-n字符串长度是否不等于零
    • 文件测试运算符,检测文件的各种属性 [operater file]
  • echo命令

    • echo -e,表示是否开启转义,直接识别字符串中需要转义的字符自动转义
    • echo string > file将string输出到文件中
  • printf命令,也是一个标准输出命令,语法printf format-string [arguments...]

  • test命令,测试变量是否相等,测试字符串,测试文件(是否存在之类的)

  • 流程控制

    • if else
    1
    2
    3
    4
    5
    6
    if [condition]
    then
    do something xxx
    else
    do something xx
    fi
    • if else-if else
    1
    2
    3
    4
    5
    6
    7
    8
    9
    if [condition]
    then
    xxxxx
    elif [condition]
    then
    xxxx
    else
    xxxx
    fi
    • for iteration
    1
    2
    3
    4
    for var i in [xxxx];
    do
    xxxx
    done;
    • while/until iteration
    1
    2
    3
    4
    while or until [condition]
    do
    xxxx
    done
    • switch case
    1
    2
    3
    4
    5
    6
    case value in
    pattern1) xxxx
    ;;
    pattern2) xxxx
    ;;
    esac
  • 函数

1
2
3
4
functionName() {
xxxx
return
}
  • 输入输出重定向 (箭头指向表明数据的流向)
    • 输出重定向command1 > file,向文件的末尾追加内容,不覆盖之前的内容 command2 >> file,也就是把输出内容写入到文件中
    • 输入重定向,从一个文件中读取数据,command < file
    • 三个特殊文件操作符 0 stdin,1 stdout,2 stderr
      • 标准输入,键盘
      • 标准输出,屏幕
      • 标准错误,屏幕,若输出标准错误到文件中使用 2>,合并标准错误和标准输出 2>&1 eg: who | greg "zeng" > file 2>&1,使用以上的命令会将标准输出和错误绑定输入到标准输出中,若who | greg "zeng" > file 2>1,则会把标准输出和错误输出到新文件中
      • tips: 这里的 2 和 > 之间不可以有空格,2> 是一体的时候才表示错误输出
  • 文件包含,使用.orsource. ./script.sh,这样被引用的文件中的变量和函数就可以在当前的脚本中使用
  • Title: shell script语法
  • Author: Xiao Qiang
  • Created at : 2023-03-16 12:20:51
  • Updated at : 2025-03-08 10:49:30
  • Link: http://fdslk.github.io/tech/shell/2023/03/16/shell-101/
  • License: This work is licensed under CC BY-NC-SA 4.0.
Comments
On this page
shell script语法