Linux操作系统-shell编程(1)

一、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架构

二、命令类型

在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

示例:

var0="aa"

var1="bb"

var2="cc"

echo "{var\[0\]},{var1},${var2}"

七、语系设定

‌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。欢迎关注留言交流。

相关推荐
j7~1 小时前
【Linux】二十四.线程篇一《一文吃透Linux线程全面解析:概念、内存管理、优缺点与用途》
linux·运维·服务器·页表·线程概念·分页式存储管理·缺页异常
ShirleyWang0122 小时前
DAY01 K3s 私有化部署排障复盘与 SOP
linux·服务器·k8s·k3s·企业部署
●VON2 小时前
鸿蒙 PC Markdown 编辑器搜索选项响应式布局:220 vp 侧栏中的完整中文控件
服务器·华为·编辑器·harmonyos·鸿蒙
AbandonForce2 小时前
Linux进程(WHAT HOW)
linux·运维·服务器
静默追光2 小时前
服务器——看门狗
linux·运维·服务器
无足鸟ICT2 小时前
【RHCA+】测试变量
linux
nVisual2 小时前
巡检任务与工单闭环方案
运维·服务器·数据库·数据中心基础设施
A-刘晨阳2 小时前
低配N1也能搭家庭录像中心:Go2RTC与EasyNVR双容器实战
运维·云计算·cpolar
隔窗听雨眠2 小时前
GitHub Actions自动化运维实战:从零构建一体化CI/CD流水线
运维·自动化·github