10. shell基础

138 阅读8分钟

大家好,我是三斤_5233

今天这篇是shell基础,内容不会很丰富。它的定位是用作手册备忘

shell是什么

Shell是一个命令行解释器,它为用户提供了一个向Linux内核发送请求以便运行程序的界面系统级程序,用户可以用Shell来启动、挂起、停止甚至是编写一些程序。

Shell还是一个功能相当强大的编程语言,易编写,易调试,灵活性较强。Shell是解释执行的脚本语言,在Shell中可以直接调用Linux系统命令。

shell脚本的执行方式

echo输出命令

echo [选项] [输出内容]

  • -e 支持转义字符

第一个脚本

vi hello.sh
#!/bin/bash
#The first program

echo "hello word"

#!/bin/bash是标记下方书写内容是shell脚本用的,非必须,但是建议写上。因为有时内容过长,会无法正确识别为shell脚本。

Bash基本功能

历史命令与命令补全

history [选项] [历史命令保存文件]

  • -c 清空历史命令
  • -w 把缓存中的历史命令写入历史命令文件~/.bash_history

历史命令默认会保存1000条,可以在环境变量配置文件/etc/profile中进行修改

命令别名

指定命令别名alias 别名='原命令'

查询命令别名alias

删除别名 unalias 别名

命令执行时顺序

  • 第一顺位执行绝对路径或相对路径的命令
  • 第二顺位执行别名
  • 第三顺位执行Bash的内部命令
  • 第四顺位按照环境变量定义顺序

以上顺序其实是对应着配置文件的加载顺序,给定命令路径当然是执行路径的命令了。不给定的,就是按照配置文件的配置执行。详见,环境变量配置文件作用

常用快捷键

快捷键作用
ctrl+a把光标移动到命令行开头
ctrl+e把光标一定到命令行结尾
ctrl+c终止当前命令
ctrl+l清屏
ctrl+u删除或剪切光标之前的命令
ctrl+k删除或剪切光标之后的命令
ctrl+y粘贴剪切的命令
ctrl+r在历史命令中搜索,按下ctrl+r后,就会出现搜索界面,只要输入搜索内容,就会从历史命令中搜索
ctrl+d退出当前终端
ctrl+z暂停,并放入后台
ctrl+s暂停屏幕输出
ctrl+q恢复屏幕输出

输入输出重定向

标准输入输出

设备设备文件名文件描述符类型
键盘/dev/stdino0标准输入
显示器/dev/stdout1标准输出
显示器/dev/stderr2标准错误输出

输出重定向

类型符号作用
标准输出重定向命令>文件以覆盖的方式,把命令的正确输出输出到指定的文件或设备中
命令>>文件以追加的方式,把命令的正确输出输出到指定的文件或设备中
标准错误输出重定向错误命令 2> 文件以覆盖的方式,把命令的错误输出输出到指定的文件或设备中
错误命令 2>> 文件以追加的方式,把命令的错误输出输出到指定的文件或设备中
正确输出和错误输出同时保存命令 > 文件 2>&1以覆盖的方式,把正确的输出和错误的输出都保存到同一个文件中
命令>> 文件 2>&1以追加的方式,把正确的输出和错误的输出都保存到同一个文件中
命令 &> 文件以覆盖的方式,把正确的输出和错误的输出都保存到同一个文件中
命令 &> 文件以追加的方式,把正确的输出和错误的输出都保存到同一个文件中
命令>>文件a 2>> 文件b把正确的输出追加到文件a中,把错误的输出追加到文件b中

输入重定向

wc[选项][文件名]

  • -c 统计字节数
  • -w 统计单词数
  • -l 统计行数

多命令顺序执行

多命令执行符格式作用
;命令1; 命令2多个命令顺序执行,命令之间没有任何逻辑关系
&&命令1&& 命令2逻辑与当前一个命令正确执行,后一个命令才会执行
||命令1|| 命令2逻辑或当前一个命令执行不正确,后一个命令才会执行
$ echo 1 && echo 2 && echo 3 && echo 4
1
2
3
4

# 下边这个第二个命令有误,后边的就都不执行
$ echo 1 && ech 2 && echo 3 && echo 4
1
zsh: command not found: ech

管道符与grep

命令格式:命令1 | 命令2

命令1的正确输出会作为命令2的操作对象

grep [选项] "搜索内容" 文件名

  • -i 忽略大小写
  • -n 输出行号
  • -v 反向查找

通配符

通配符作用
?匹配一个任意字符
*匹配0个或多个任意字符,也就是可以匹配任何内容
[]匹配中括号中任意一个字符。例如:[abc]代表一定匹配一个字符,或者a,或者是b,或者c
[-]匹配中括号中任意一个字符。-表示一个范围。例如:[a-z]代表匹配一个小写字母。
[^]逻辑非。表示匹配不是括号中的一个字符。例如:[^0-9]表示匹配非数字

Bash中特殊符号

通配符作用
‘’单引号。在单引号中,所有特殊符号,如$`反引号都没有特殊含义。均是字面值
“”双引号。字符串,特殊符号会起作用。他们还是特殊符号
``反引号。反引号括起来的内容是系统命令,在Bash中会执行它。和$()作用一样,不过推荐使用 $(),因为反引号非常容易看错
$()和反引号作用一样,用来引用系统命令
#在shell脚本中,#开头的行代表注释
$用于调用变量的值,如果需要调用变量name时,需要用$name的方式得到变量的值
\转义符,跟在\之后的特殊符号将失去特殊含义,变为字符面值

Bash变量

  • 变量名称可以由字母、数字和下划线组成,但是不能以数字开头。如变量名是“2name”则是错误的。
  • 在Bash中,变量的默认类型都是字符串型,如果要进行数值运算,则必须指定变量类型为数值型。
  • 变量用等号连接值,等号左右两侧不能有空格。
  • 变量的值如果有空格,需要使用单引号或双引号包括。
  • 在变量的值中,可以使用“\”转义符。
  • 如果需要增加变量的值,那么可以进行变量值的叠加。不过变量需要用双引号包含“$变量名”或用${变量名}包含。
  • 如果是把命令的结果作为变量值赋予变量,则需要使用反引号或$()包含命令。
  • 环境变量名建议大写,便于区分。

用户自定义变量

变量定义:name="Anthony_4926"

变量叠加:

  • aa=123
  • aa="$aa"456
  • aa=${aa}789

环境变量

用户自定义变量只在当前的Shell中生效,而环境变量会在当前Shell和这个Shell的所有子Shell当中生效。如果把环境变量写入相应的配置文件,那么这个环境变量就会在所有的Shell中生效

  • 设置环境变量:export 变量名=变量值
  • 查询变量:env
  • 删除环境变量:unset 变量名

系统常见环境变量

  • PATH:系统查找命令的路径
$ echo ${PATH}
/Library/Frameworks/Python.framework/Versions/3.9/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/go/bin
  • PS1:定义命令行前缀
\d : 代表日期
\H : 完整的主机名称
\h : 仅取主机的第一个名字
\t : 显示时间为24小时格式,如:HH:MM:SS
\T : 显示时间为12小时格式
\A : 显示时间为24小时格式:HH:MM
\u : 用户名
\v : BASH的版本信息
\w : 完整的工作目录名称
\W : 列出最后一个目录
$ : 提示字符,如果是root时,提示符为:# ,普通用户则为:$

位置参数变量

位置参数变量作用
$nn为数字,$0代表命令本身,$1-$9代表第一到九个参数,十以上的参数需要用大括号包含,如${10}
$*这个变量代表命令行中所有的参数,$*把所有的参数看成一个整体
$@这个变量也代表命令行中所有的参数,不过$@把每个参数区分对待
$#代表命令行中所有参数的个数

$n:假设有一个脚本 my_script.sh,它接受两个参数 name 和 age。如果在命令行中运行以下命令:

$ bash my_script.sh Alice 30

预定义变量

预定义变量作用
$?最后一次执行的命令的返回状态。如果这个变量的值为0,证明上一个命令正确执行;如果这个变量的值非0,则证明上一个命令执行不正确
$$当前进程的进程号PID
$!后台运行的最后一个进程的进程号PID

接收键盘输入

read [选项][变量名]

  • -p “提示信息”
  • -t 秒数。read命令会一直等待用户输入,使用此选项可以指定等待时间
  • -n 字符数。 read命令只接受指定的字符数,就会执行
  • -s 隐藏输入的数据,适用于机密信息的输入

Bash运算符

数值运算

方法一: declare

$ aa=1
$ bb=2
$ declare -i cc=${aa}+${bb}
$ echo ${cc}
3

方法二:expr或let数值运算工具

$ aa=1
$ bb=2
$ dd=$(expr ${aa} + ${bb})
$ echo dd
3

方法三: $((运算式)) $[运算式]

$ aa=1
$ bb=2
$ ee=$((${aa} + ${bb}))
$ ff=$[${aa} + ${bb}]

变量测试与内容替换

这个我就没搞懂是干啥用的

变量置换方式变量y没有设置变量y为空值变量y设置值
x=${y-新值}x=新值x为空x=$y
x=${y:-新值}x=新值x=新值x=$y
x=${y+新值}x为空x=新值x=$y
x=${y:+新值}x为空x为空x=新值
x=${y=新值}x=新值y=新值x=$y
x=${y:=新值}x=新值y=新值x=$y
x=${y?新值}新值输出到标准错误输出(屏幕)错误输出(屏幕)

环境变量配置文件

环境变量配置文件中主要是定义对系统的操作环境生效的系统默认环境变量,比如PATH、HISTSIZE、PS1、HOSTNAME等 默认环境变量。

重新加载配置文件,使新的配置生效:

  • source 配置文件
  • . 配置文件

环境变量配置文件作用

/etc/profile 是一个系统级别的 Shell 配置文件,它定义了全局的环境变量和函数。当一个新用户登录时,该文件会被自动执行,并设置一些默认的环境变量。

以下是 /etc/profile 中定义的一些常用环境变量:

  • PATH:指定系统可执行文件的路径列表。
  • HOME:指定用户的主目录路径。
  • USER:指定当前登录的用户名。
  • SHELL:指定默认的 Shell 程序。
  • LANG:指定系统的本地化语言环境。
  • DISPLAY:如果没有指定 X Window System,则为“:0”,否则为实际的 X11 显示器编号。
  • EDITOR:指定默认的文本编辑器。
  • XDG_SESSION_ID:为每个 X Window System 会话分配唯一的 ID。
  • LESSOPEN:允许在 less 命令中使用分页符。
  • PWD:显示当前工作目录的完整路径。

此外,/etc/profile 还定义了许多其他函数和变量,例如 setuid,setgid,umask 等等。这些函数和变量可以在 ~/.bashrc~/.bash_profile 等个人配置文件中进行覆盖和修改。