一、SHELL简介

Linux Shell种类非常多,常见的SHELL如下:

  1. Bourne Shell(/usr/bin/sh或/bin/sh)
  2. Bourne Again Shell(/bin/bash)
  3. C Shell(/usr/bin/csh)
  4. K Shell(/usr/bin/ksh)
  5. Shell for Root(/sbin/sh)

不同的Shell语言的语法有所不同,最常用的shell是Bash,也就是Bourne Again Shell。我们为什么需要shell呢?用户需要操作硬件,硬件是通过内核驱动的,但用户是不能操作内核的,这时shell就起到一个用户和内核之间沟通的桥梁作用。用户可以输入shell命令执行,又可以利用 Shell脚本编程去运行。

Bash架构

Bash架构图

二、命令类型

在Linux系统中,命令可以分为两类:内建命令(Built-in Commands)和外部命令(External Commands)。内建命令是由shell本身提供的,而外部命令则是独立的程序,通常存储在文件系统的某个目录下,比如/bin/usr/bin等。内建命令的执行速度通常比外部命令快,因为它们不需要加载独立的程序。

type: 查询是否为内建命令

示例: type [指令]

三、变量定义

在 Linux Shell 中,变量的本质是字符串。定义变量时,等号两边不能有空格;引用变量时,需要在变量名前加上 $ 符号。

var=name

变量的规则:

  1. 变量与变量内容之间用"="连接,且两边不能有空格
  2. 数字不能作为变量名的开头
  3. 变量内容若有空格可使用双引号""或单引号''将变量的内容连接起来。双引号内的特殊字符保留原有特性;单引号内的特殊字符仅为普通字符
  4. 可用跳脱字符"\"将特殊字符变成一般字符
  5. 执行指令中借由其他指令提供信息时,可用``
  6. 扩增变量内容时,可用"$变量名称"累加内容,或${变量名称}累加内容
  7. 需要在其他子程序中执行:export 变量名称 将变量变成环境变量
  8. 通常大写为系统变量,小写为自定义变量
  9. 取消变量:unset 变量名称

四、变量读取

可以通过如下命令获取变量值。

echo $变量名echo ${变量名}

五、变量类型

Shell 变量根据其作用域和来源,主要可分为四大类:自定义变量环境变量位置变量特殊变量

自定义变量:由用户自行定义,仅在当前 Shell 会话中有效,子进程无法继承。定义时直接使用 var=value 格式赋值。
环境变量:全局有效,当前进程及其子进程均可访问。通过 export var=value 设置,常见的有 PATHHOMEUSER 等。
位置变量:在脚本传参时自动接收,以 $1$2$n 形式表示,其中 $0 为脚本名,$# 为参数个数。
特殊变量:由 Shell 内置,不可手动赋值,例如 $$(当前进程 PID)、$?(上一条命令的退出状态)、$*$@(所有参数)。

1、环境变量

常用的环境变量有PATH、HOME、USER、PS1等

PS1: 提示字符的设定

  • \d 日期
  • \H 完整主机名
  • \h 主机名第一段
  • \t 24小时,时分秒
  • \T 12小时,时分秒
  • \A 24小时,时分
  • \@ 12小时,am/pm
  • \u 用户
  • \V bash版本
  • \w 完整工作目录
  • \W 工作目录
  • \# 第几条指令
  • \$ 提示字符

HOME: 用户的家目录

PATH: 命令的查找路径,从前往后查找,如果没有找到,输出“command not found”

USER: 当前用户

2、特殊变量

  • $: 本shell的PID
  • ?: 上一个命令执行的回传值
  • export: 环境变量,示例: export 变量名称

如上图

echo $?  #上一条命令的执行结果成功显示0,非0则表示失败;

echo $$  #表示本shell的进程号;

var=name #定义了一个变量;

export var #转换成一个环境变量;

bash         #创建了一个子shell;

然后在子shell中可以获取到父shell的变量var的值,因为在父shell中var被转换成了环境变量,是用env可以查看环境变量。

3、位置变量

   在执行脚本时,通常使用./shell.sh name age score的形式命令执行脚本。

   $0: 表示脚本名称shell.sh;

   $1:表示脚本执行的第一个参数;

   $2:表示脚本执行的第二个参数;

    。。。。。。

 $#: 表示为参数个数;

    $@: 表示所有参数,每个参数是独立的;

    $*:    表示所有参数,所有参数作为一个整体。

    六、变量的输入、数组和声明

     read [-pt] variable

    示例: read -p "please enter yes/no:" -t 30 test

    -p: 给出提示信息

    -t: 设置超时时间

    declare: declare [-aixr] variable

    示例: declare -i sum=100+50+50

    echo ${sum}

    数组: Var[index]=content

    示例:

    var[0]="aa"

    var[1]="bb"

    var[2]="cc"

    echo "${var[0]},${var[1]},${var[2]}"

    七、语系设定

    ‌Linux locale 就是系统用来决定显示什么语言、怎么排日期数字的一套规则‌。如果没有设置合适的编码,可能会导致显示乱码问题。

    • locale -a
    • locale
    • LANG=en_US.UTF-8
    • LC_ALL=en_US.UTF-8

    八、命令别名与历史命令

    alias, unalias:

    • alias 别名='命令 选项' #设置命令别名
    • unalias 别名       #取消别名设定
    历史命令
    • history [n]
    • history [-c]
    • history [-raw] histfiles
    • !number #执行第多少条命令
    • !command #执行包含command的命令
    • !! #执行上一条命令

    九、Bash欢迎信息

    /etc/issue:

    • \d: 本地端的日期
    • \l: 第几个终端
    • \m: 显示硬件的等级
    • \n: 显示主机名称
    • \O: 显示domain name
    • \r: 作业系统的版本
    • \t: 本地端时间
    • \S: 作业系统名称
    • \v: 作业系统版本

    /etc/motd: 登陆后的提示信息

    十、Bash快捷键

    • Ctrl+D    #在空行时退出 Shell
    • Ctrl+M   #回车键(Enter)
    • Ctrl+A    #移动到命令行首
    • Ctrl+E    #移动到命令末尾
    • Ctrl+U    #冲当前光标位置删到行首
    • Ctrl+K    #从当前光标位置删到行尾

    十一、通配符

    • *: 0到无穷个任意字符
    • ?: 匹配1个字符
    • []: 匹配括号内的一个字符
    • [-]: 匹配范围内的一个字符
    • [^ ]: 匹配非括号内的一个字符
    • #: 注释
    • \: 转义字符
    • |: 管道符
    • ;: 连续下达多条命令
    • ~: 家目录
    • $: 变量读取
    • &: 进程变成后台运行
    • !: 逻辑运算非
    • /: 目录符号
    • >, >>: 输出,>表示覆盖,>>表示追加
    • <, <<: 输入
    • '': 单引号内为纯文字
    • "": 双引号内可有变量功能
    • ``: 先执行命令
    • (): 子shell起始与结束的组合
    • {}: 中间为命令区块的组合

    十二、重定向

    • >, >>    # 输出重定向,>表示覆盖,>>表示追加。
    • <, <<    # 输入重定向,< 将‌现有文件的内容‌作为命令的标准输入(stdin),替代键盘输入; <<在命令行中直接定义‌多行文本块‌作为命令的输入,直到遇到指定的结束标记(如 EOF)。
    • 2>, 2>> #2>‌(覆盖模式):将命令执行产生的‌错误信息‌重定向到指定文件。如果文件已存在,会‌清空原内容并覆盖‌;如果文件不存在,则创建新文件; 2>>‌(追加模式):将命令执行产生的‌错误信息‌重定向到指定文件的‌末尾‌。如果文件已存在,内容会‌累加‌而不覆盖;如果文件不存在,则创建新文件。

    实例:

    十三、连续执行多条命令

    • ;: 连续下达多条指令
    • &&: 前一条指令执行成功,才能执行后一条指令
    • ||: 前一条指令没有执行成功才能执行后一条指令

    十四、管道命令

    |: 前一个命令的输出作为后面命令的输入

    十五、截取命令

    • cut -d '分隔字符' -f fields filename

          -d:指定分割符号

          -f:指定需要选取的字段

    十六、排序命令

    sort命令用于对文本文件内容进行排序

    -r:逆序排序(降序)。

    -n:按数值进行排序。

    -k 字段:按指定的字段进行排序。该参数可指定多个字段,使用逗号分隔。默认字段分隔符为制表符或空格。

    -t 分隔符:指定字段的分隔符。

    -u:去除重复行,仅保留第一次出现的行。

    -f:忽略大小写进行排序。

    -b:忽略行首的空白字符进行排序。

    -c:检查文件是否已经排好序,如果未排序则输出第一个不符合排序顺序的行。

    -f:忽略大小写进行排序。例如,sort -f file.txt 将忽略行首字母的大小写进行排序。

    -b:忽略行首的空白字符进行排序。

    -c:检查文件是否已经排好序,如果未排序则输出第一个不符合排序顺序的行。

    uniq是Linux中专门用来处理重复行的命令

    -c:在每行前面添加该行在文件中出现的次数;

    -d:仅显示有重复的行;

    -u:仅显示没有重复的行;

    -i:在比较行时忽略字符大小写。

    wc 命令用于统计文件中的字节数、字数、行数等

    -l:选项表示只统计行数

    -w:统计单词数

    -c:统计字节数

    举例:统计地址列表中重复次数最多的前10个地址

    十七、其他命令

    • 双向重定向: tee -a file 输出到文件和屏幕

    • 字符转换命令: tr/col/join/paste/expand

    • 分割命令: split

    本节介绍了一些shell命令的用法,是shell编程的基础,下一节将介绍shell文本处理“四剑客”:grep、sed、awk、find。欢迎关注留言交流。

    Logo

    openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

    更多推荐