shell

        Linux 是一个操作系统内核,而 shell 是用户与操作系统交互的命令行界面。在 Linux 上,shell 提供了一个环境,让用户可以执行命令、运行程序和编写脚本。常见的 Linux shell 包括 Bash、Zsh 和 Fish。简而言之,Linux 是系统的核心,shell 是与这个核心交互的工具。

一、shell本质

shell是一个命令行解释器,将用户命令解析为操作系统所能理解的指令,实现用户与操作系统的交互,许多Ubuntu Linux功能使用shell命令来实现,当需要重复执行若干命令,可以将这些命令集合起来,加入一定的控制语句,编辑成为shell脚本文件,交给shell批量执行

二、shell变量

shell允许用户建立变量存储数据,但不支持数据类型(整型、字符、浮点型),将任何赋给变量的值都解释为一串字符,格式为:变量=value

引用变量在变量前加$,例如:echo $NAME(打印变量NAME的值)
只读变量

使用 readonly 命令将变量声明为只读,即不允许修改其值:readonly NAME="Pwl"

删除变量unset NAME
特殊变量
  • $0:当前脚本的文件名。
  • $1, $2, ...:第一个、第二个参数等。
  • $#:传递给脚本的参数个数。
  • $@:传递给脚本的所有参数的列表。
  • $?:上一个命令的退出状态(0 表示成功,非0 表示失败)
环境变量

HOME: /etc/passwd文件中列出的用户主目录
IFS:Internal Field Separator, 默认为空格,tab及换行符
PATH :shell搜索路径
PS1,PS2:默认提示符($)及换行提示符(>)
TERM:终端类型,常用的有vt100,ansi,vt200,xterm等

三、shell通配符

通配符允许在文件名匹配或搜索时使用模式来代替特定字符或字符串,从而更加灵活和方便地操作文件系统。

通配符解释说明
*(星号):匹配任意长度的任意字符(包括空字符)例如,*.txt 匹配所有以 .txt 结尾的文件名
?(问号):匹配单个任意字符例如,file?.txt 匹配 file1.txt、fileA.txt 等
[ ](方括号):匹配括号内的任何单个字符例如,file[123].txt 匹配 file1.txt、file2.txt、file3.txt
[-] 匹配指定的一个字符范围例如,file_[a-z].txt 匹配 file_a.txt 到 file_z.txt
[! ] 或 [^ ]:匹配不在括号内的任何单个字符例如,file[!AB].txt 匹配 fileC.txt、file1.txt,但不匹配 fileA.txt 或 fileB.txt

四、shell管道

管道(Pipeline)允许将一个命令的输出直接作为另一个命令的输入。这种连接方式使得可以在不生成中间临时文件的情况下,将多个命令串联起来,形成一个连续的数据处理流程。

管道使用竖线符号 | 来表示。例如,command1 | command2       这里,command1 的输出作为 command2 的输入。

五、输出输入重定向

符号解释

> file

> 符号将命令的标准输出重定向到指定的文件。如果文件不存在,则创建新文件;如果文件已存在,则会被覆盖

ls /usr > Lsoutput.txt 将 ls /usr 命令的输出重定向到 Lsoutput.txt 文件中。如果 Lsoutput.txt 已经存在,执行该命令会清空文件内容再写入新的输出。

>> file

>> 符号将命令的标准输出以追加模式重定向到指定的文件。追加模式会将输出添加到文件末尾,而不是覆盖文件内容

ls /usr >> Lsoutput.txt 将 ls /usr 命令的输出追加到 Lsoutput.txt 文件末尾。

< file

< 符号将文件的内容重定向为命令的标准输入。命令将从指定文件中读取输入,而不是从键盘输入。

wc < file1 将 file1 文件的内容作为 wc 命令的输入,统计文件中的行数、字数和字节数

2> 或 &>

2> 将命令的标准错误输出重定向到指定文件中。

&> 是一种更通用的形式,将标准输出和标准错误输出都重定向到同一个文件中。

ls noexistingfile.txt 2> err.log 将 ls 命令在尝试查看不存在的文件时生成的错误信息重定向到 err.log 文件中

六、shell内建命令

命令符功能语法或参数举例

:

扩展参数列表,执行重定向操作

: 是一个空操作,通常用于占位或作为占位符使用

.

读取并执行指定文件中的命令(在当前 shell 环境中)

用于在当前 shell 环境中执行指定文件中的命令,使得这些命令在当前环境中生效。

alias

为指定命令定义一个别名

1、创建简单别名:alias 【别名】='【要执行的命令】'

2、创建带参数的别名: alias 【别名】='【别名】 --【参数】'

  • 示例: alias ll='ls -alF'
  • 说明: alias 用于创建命令的别名,例如将 ll 设置为 ls -alF 的别名,方便使用长命令的简化版本。
  • alias grep='grep --color=auto' 为 grep 添加了 --color=auto 参数,使得 grep 命令在匹配时显示颜色

bg

将作业以后台模式运行

语法:bg 【作业编号或作业名称】
  • 示例: bg %1
  • 说明: bg 将指定的作业切换到后台运行,例如 %1 是作业的标识符

bind

将键盘序列绑定到一个 readline 函数或宏

  • -l: 列出当前所有键绑定。
  • -p: 以可用于重新读取的格式列出所有键绑定。
  • -s: 显示或修改键序列的绑定。
  • -v: 显示 bind 命令的版本。
  • -P: 显示当前所有键绑定的详细描述。
  • -S: 显示一个可以用来交换键序列的绑定。
  • -V: 显示 bind 命令的版本。
  • -r: 删除指定键序列的绑定。
  • -x: 将键序列绑定到一个 shell 命令,而不是 readline 命令。这在需要将键绑定与外部命令关联时非常有用。
  • 示例: bind '"\e[A": history-search-backward'
  • 说明: bind 用于将键盘序列绑定到一个 readline 函数或宏,例如将向上箭头键绑定到历史命令搜索

break

退出 for、while、select 或 until 循环

builtin

执行指定的 shell 内建命令

  • 示例: builtin echo hello
  • 说明: builtin 用于执行指定的 shell 内建命令,而不是外部程序,例如执行内建的 echo 而不是系统的 echo。

caller

返回活动子函数调用的上下文

  • 示例: 在脚本中调用 caller 以查看调用堆栈信息。
  • 说明: caller 显示活动子函数的调用上下文。

cd

将当前目录切换为指定的目录

command

执行指定的命令,无需进行通常的 shell 查找

  • 示例: command ls
  • 说明: command 用于执行指定的命令,忽略 shell 的内建命令,例如执行外部的 ls 而不是内建的 ls。

compgen

为指定单词生成可能的补全匹配

  1. -a: 列出所有别名 (aliases)。

  2. -A function: 列出所有函数名称。

  3. -b: 列出所有Shell内建命令。

  4. -c: 列出所有当前Shell可执行的命令。

  5. -d: 列出所有目录名称,用于目录补全。

  6. -e: 列出所有环境变量的名称。

  7. -g: 列出所有全局变量的名称。

  8. -k: 列出所有关键字(keywords)。

  9. -s: 列出所有Shell变量的名称。

  10. -t: 列出所有Shell内建命令和关键字。

  11. -v: 列出所有Shell变量和函数名称。

# 列出当前 shell 可用的内建命令
compgen -b

# 列出当前 shell 可用的函数
compgen -A function

# 列出当前 shell 可用的别名
compgen -a

complete

显示指定的单词是如何补全的

  • -a:使用所有命令的名称作为补全的候选项。
  • -b:使用内建命令的名称作为补全的候选项。
  • -c:使用所有命令的名称,并在每个名称后面添加冒号(:)作为补全的候选项。
  • -d:使用目录名称作为补全的候选项。
  • -e:使用环境变量的名称作为补全的候选项。
  • -f:使用文件名称作为补全的候选项。
  • -g:使用组名称作为补全的候选项。
  • -j:使用作业(job)名称作为补全的候选项。
  • -k:使用关键字名称作为补全的候选项。
  • -l:使用别名名称作为补全的候选项。
  • -s:使用信号名称作为补全的候选项。
  • -t:使用函数名称作为补全的候选项。
  • -u:使用用户名称作为补全的候选项。
  • -v:使用变量名称作为补全的候选项。
  • -A action:定义补全的动作,action 可以是 alias、arrayvar、builtin、command、directory、file、function、group、helptopic、hostname、job、keyword、running、service、setopt、shopt、signal、stopped、user 或 variable。
  • -B action:类似于 -A,但 action 是一个 Bash 函数,用于动态补全。
  • -G globpat:设置用于文件名补全的 glob 模式。
  • -W wordlist:指定用于命令或参数补全的空格分隔的单词列表。
  • -X filterpat:使用通配符过滤文件名。
  • -F function:指定一个 Bash 函数用于动态补全。
  • -P prefix:为补全的结果添加一个前缀。
  • -S suffix:为补全的结果添加一个后缀。
  • -r:移除已定义的补全行为。
  • -d:禁用补全功能,适用于指定的命令或选项。

# 为命令 ls 设置自动补全函数
complete -F _longopt ls

# 设置命令 grep 的补全选项
complete -o nospace -W "-A -B -C" grep

compopt

修改指定单词的补全选项

  • -o:启用指定的补全选项。
  • -u:禁用指定的补全选项。
  • -o <option-name>:可以是以下之一:
    • nospace:不在补全后添加空格。
    • default:恢复为默认的补全行为。
    • dirnames:补全目录名。
    • filenames:补全文件名。
    • plusdirs:包括目录名在内的文件名补全。
    • nosort:不排序补全选项。
    • menu:使用菜单样式的补全。
    • bashdefault:使用 Bash 的默认补全行为。
    • default:将补全选项恢复为默认状态。
    • dirnames:启用目录名补全选项。
    • filenames:启用文件名补全选项。
    • nospace:禁用自动添加空格的选项。

# 设置自动补全行为,例如禁止使用通配符
compopt -o nospace

# 显示当前补全的所有选项
compopt -o

continue

继续执行 for、while、select 或 until 循环的下一次迭代

  • 示例: declare -i num=5
  • 说明: declare 或 typeset 用于声明变量或设置变量的属性,例如声明一个整数类型的变量 num

declare

声明一个变量或变量类型。

语法: declare 【参数】 【变量名】=【值】

参数:

  • -a:声明一个数组变量。
  • -f:显示函数定义。
  • -F:只显示函数名,不显示函数体。
  • -g:将变量声明为全局变量(在函数外部有效)。
  • -i:声明一个整数变量。
  • -l:将变量值转换为小写字母。
  • -n:扫描名称中的下一个单词作为变量名。
  • -p:显示变量的属性和值。
  • -r:将变量声明为只读变量。
  • -t:将变量声明为一个名为 test 的有效变量。
  • -u:将变量值转换为大写字母。
  • -x:将变量声明为环境变量。
  1. declare myvar="Hello"

    这将创建一个名为 myvar 的普通变量,并初始化其值为 "Hello"。

  2. declare -r readonly_var="Cannot change this value"

    这将创建一个名为 readonly_var 的只读变量,一旦赋值后就不能再修改其值。

  3. declare -i number=42

    这将创建一个名为 number 的整数变量,只能存储整数值。

  4. declare -a myarray=(1 2 3 4 5)

    这将创建一个名为 myarray 的数组变量,包含了整数元素 1 到 5。
     

dirs

显示当前存储目录的列表

  • -c:清空整个目录堆栈。使用这个选项后,目录堆栈中的所有目录都会被移除。

  • -l:使用长格式显示目录堆栈中的目录。长格式显示包括目录的完整路径,并且每个目录占一行显示。

  • -p:显示当前目录堆栈中的目录,并且每个目录都在单独的一行显示,可以方便地进行处理或传递给其他命令。

  • -v:使用详细格式显示目录堆栈中的目录。详细格式显示与长格式类似,但在每个目录的前面会显示一个索引编号。

  • +N:将目录堆栈中的第 N 个目录移动到顶部。索引从 0 开始计数,所以 +0 是第一个目录。

  • -N:移除目录堆栈中的第 N 个目录。同样,索引从 0 开始计数。

  •  dirs -v
    dirs 显示目录栈中的当前目录列表,例如显示详细信息(使用 -v 选项)
  • dirs +2

    这会将目录堆栈中索引为 2 的目录移动到栈顶

disown

从进程作业表中刪除指定的作业

  • -a:移除当前 shell 中所有的后台作业,等同于不提供任何 jobspec 或 pid。

  • -r:移除在后台运行的所有已完成作业,即已经完成的后台作业。

  • -h:标记指定的作业,使得在作业退出后不会发送 HUP 信号。

  • -v:输出详细信息,显示每个作业的状态信息。

  • -D:如果指定了 -D,则 disown 不会移除作业,而是将作业标记为不接收 SIGHUP 信号。

  • 示例: disown %1
  • 说明: disown 从 shell 的作业列表中移除指定的作业,例如移除标识符为 %1 的作业

echo

将指定字符串输出到 STDOUT

enable

启用或禁用指定的内建shell命令

  • -a:启用所有被禁用的内置命令。

  • -d:禁用指定的内置命令,使其不能在当前 shell 会话中执行。

  • -n:列出当前 shell 中已经禁用的内置命令。

  • -p:重新启用被禁用的内置命令,使其可以在当前 shell 中执行。

  • -s:将指定的函数定义作为 shell 内置命令启用。

  • 示例: enable -n echo
  • 说明: enable 启用或禁用 shell 内建命令,例如禁用内建的 echo

eval

将指定的参数拼接成一个命令,然后执行该命令

  • 示例: eval "ls -l"
  • 说明: eval 将参数作为命令执行,例如将 "ls -l" 字符串作为命令执行

exec

用指定命令替换 shell 进程

  • -c:清除环境变量,除了指定的环境变量以外。
  • -l:清除当前的环境变量。
  • 示例: exec myprog
  • 说明: exec 用新的命令(例如 myprog)替换当前 shell 进程

exit

强制 shell 以指定的退出状态码退出

  • 示例: exit 0
  • 说明: exit 终止 shell 的执行并返回指定的退出状态码,例如退出并返回状态码 0

export

设置子 shell 进程可用的变量

  • 示例: export PATH=$PATH:/usr/local/bin
  • 说明: export 设置环境变量,使得子进程可以访问,例如将 /usr/local/bin 添加到 PATH 环境变量中。

fc

从历史记录中选择命令列表

  • -l: 列出历史命令,显示编号和命令内容。
  • -n: 指定新命令的编号。
  • -r: 逆序列出历史命令。
  • 示例: fc -l 1 10
  • 说明: fc 用于历史命令的选择和编辑,例如列出历史记录中编号从 1 到 10 的命令

fg

将作业以前台模式运行

  • 示例: fg %1
  • 说明: fg 将指定的作业切换到前台运行,例如将标识符为 %1 的作业切换到前台

getopts

分析指定的位置参数

在脚本中使用 getopts 解析命令行选项

hash

查找并记住指定命令的全路径名

-p: 强制 hash 忽略当前缓存,并按指定的路径进行搜索并存储

-r: 清除 hash 表,移除所有记住的命令路径

-d: 删除指定命令的路径记录

  • 示例: hash -r
  • 说明: hash 记录命令的路径,加快后续执行速度,例如使用 -r 选项刷新路径缓存

help

显示帮助文件

history

显示命令历史记录

  • 示例: history | grep ls
  • 说明: history 显示命令的历史记录,例如显示包含 ls 的历史命令

jobs

列出活动作业

  • -l: 显示作业编号及其进程号。
  • -n: 列出最近的作业。
  • -p: 只显示作业的进程组标识号码。
  • -r: 只显示正在运行的作业。
  • -s: 只显示已停止的作业。
  • 示例: jobs
  • 说明: jobs 显示当前 shell 中的活动作业,例如列出当前的作业列表

kill

向指定的进程 ID(PID) 发送一个系统信号

  • 示例: kill -9 1234
  • 说明: kill 向指定的进程 ID(例如 1234)发送信号,例如发送 SIGKILL(-9)信号

let

计算一个数学表达式中的每个参数

  • 示例: let "num = 5 + 3"
  • 说明: let 执行算术运算,例如计算 5 + 3 并将结果赋给 num 变量

local

在函数中创建一个作用域受限的变量

logout

退出登录 shell

mapfile

从 STDIN 读取数据行,并将其加入索引数组

  • -n count: 指定读取的行数上限。
  • -O origin: 指定从数组的第 origin 个索引位置开始存储,默认为 0。
  • -s count: 指定要跳过的初始行数。
  • -t: 去除每一行末尾的换行符。
  • -u fd: 从文件描述符 fd 中读取输入。
  • -C callback: 指定回调函数 callback,对每个读取的行进行处理。
  • -c quantum: 指定每次读取的行数(量子),提高效率
    • 示例: mapfile -t array < file.txt
    • 说明: mapfile 从 STDIN 读取数据行并将其放入数组,例如从 file.txt 文件中读取数据。

popd

从目录栈中删除记录

popd [-n] [+N | -N]

  • -n:不进行目录切换。只是从堆栈中弹出顶部目录,但不改变当前工作目录。
  • +N:将堆栈中索引为 N 的目录弹出并切换到该目录。
  • -N:从堆栈顶部弹出第 N 个目录并切换到该目录。-1 表示最顶部的目录,-2 表示第二个顶部目录,以此类推。

popd +2

这会从堆栈中弹出第二个目录,并将工作目录切换到该目录。

printf

使用格式化字符串显示文本

pushd

向目录栈添加一个目录

  • 示例: pushd /path/to/directory
  • 说明: pushd 将指定的目录添加到目录栈中

pwd

显示当前工作目录的路径名

read

从 STDIN 读取一行数据并将其赋给一个变量

  • -p prompt:指定一个提示符,用来提示用户输入。

  • -r:防止反斜杠字符的转义。在处理文件路径等输入时,通常建议使用 -r 选项,以避免意外的字符转义。

  • -s:静默模式,用户输入内容不显示在终端上,通常用于密码输入。

  • -n num:设置读取的字符数目,达到指定字符数后立即返回。这在读取固定长度的输入时很有用。

  • -t timeout:设置一个超时时间(秒),如果在指定时间内没有输入,则返回一个非零退出状态。

  • 示例: read -p "Enter your name: " name
  • 说明: read 从 STDIN 读取一行数据并将其赋给变量 name,例如提示用户输入名字

readarray

从 STDIN 读取数据行并将其放入索引数组

  1. -n count:指定读取的行数。默认情况下,readarray 会一直读取直到结束。使用 -n 可以限制读取的行数。

  2. -O origin:设置数组的起始索引。默认情况下,数组的起始索引是 0。可以使用 -O 来指定其他起始索引。

  3. -s count:跳过输入中的前几行。即从输入中开始读取时跳过指定的行数。

  4. -t:删除末尾的换行符。默认情况下,readarray 会保留每行的换行符,使用 -t 可以删除这些换行符。

  5. -u fd:从文件描述符 fd 中读取输入。默认情况下,readarray 从标准输入读取。

  6. -C callback:在读取每行之前调用 callback 函数。可以用来预处理输入行。

  7. -c quantum:指定每次调用 callback 函数处理的行数。默认是 5000 行。

  8. -i text:在读取之前插入指定的文本。即每行读取前会在该行前插入指定的文本。

  9. -p prompt:显示提示符,提示用户输入。类似于 read 命令的 -p 选项。

  10. -t timeout:设置超时时间(秒),如果在指定时间内没有输入,则返回非零退出状态。

  11. -z:以 NUL 字符而不是换行符作为行分隔符。

  12. -a array:指定数组的名称,将读取的行存储到指定的数组中。

  13. array:如果提供了数组名称,则将读取的行存储到该数组中。如果未提供,则默认使用 $MAPFILE

readonly

从 STDIN 读取一行数据并将其赋给一个不可修改的变量

return

强制函数以某个值退出,这个值可以被调用脚本提取

set

设置并显示环境变量的值和 shell 属性

  • set -e:使得脚本在执行过程中如果遇到错误(非零返回值)就立即退出。
  • set +e:禁用 set -e 的效果,使得脚本在遇到错误时不立即退出。
  • set -u:使得脚本在使用未设置过的变量时显示错误信息。
  • set -x:启用调试模式,输出每个命令执行前的具体内容。
  • set +x:禁用调试模式。
  • set -o option:打开特定的 shell 选项,如 set -o noclobber 可以防止使用 > 和 >> 覆盖已存在的文件。
  • 示例: set -x
  • 说明: set 设置环境变量的值和 shell 的属性,例如启用调试模式(-x 选项)

shift

将位置参数依次向下降一个位置

  • 示例: shift 2
  • 说明: shift 将命令行参数依次向下移动一个位置,例如将参数向左移动两个位置

shopt

打开/关闭控制 shell 可选行为的变量值

    • shopt -s option_name:启用指定的选项。
    • shopt -u option_name:禁用指定的选项。
      • globstar:允许使用 ** 来匹配任意层数的目录。
      • nocaseglob:在文件名匹配时不区分大小写。
      • nullglob:如果没有匹配的文件名时,返回空字符串而不是原始的通配符模式。
    • shopt -p:显示当前设置的 shell 选项,以便可以重新应用它们。
    • shopt -q:静默模式,用于测试选项是否已启用,无输出则表示启用。
  • 示例: shopt -s extglob
  • 说明: shopt 设置 shell 的可选行为,例如启用扩展的 globbing 功能

source

读取并执行指定文件中的命令(在当前 shell 环境中)

suspend

暂停 Shell 的执行,直到收到一个 SIGCONT 信号

test

基于指定条件返回退出状态码 0 或 1

  • 示例: [ -f file.txt ]
  • 说明: test 或 [ 执行条件测试,例如测试文件是否存在(-f file.txt)

times

显示累计的用户和系统时间

trap

如果收到了指定的系统信号,执行指定的命令

  • 示例: trap "cleanup" EXIT
  • 说明: trap 捕捉并处理信号,例如在退出时执行 cleanup 函数

type

显示指定的单词如果作为命令将会如何被解释

  • 示例: type ls
  • 说明: type 显示指定命令将如何被解释,例如显示 ls 命令的类型(alias、函数、内建命令等)

typeset

声明一个变量或变量类型。

ulimit

为系统用户设置指定的资源的上限

  • -c:设置或显示 core 文件的最大字节数 (bytes)。
  • -d:设置或显示数据段的最大字节数。
  • -f:设置或显示文件的最大字节数。
  • -l:设置或显示锁定内存的最大字节数。
  • -m:设置或显示常驻内存的最大字节数。
  • -n:设置或显示文件描述符的最大数量。
  • -q:设置或显示 POSIX 消息队列的最大字节数。
  • -r:设置或显示实时调度的最大优先级。
  • -s:设置或显示栈的最大字节数。
  • -t:设置或显示 CPU 时间的最大秒数。
  • -u:设置或显示用户的最大进程数量。
  • -v:设置或显示虚拟内存的最大字节数。
  • -x:设置或显示文件锁的最大字节数。
  • 示例: ulimit -n 1024
  • 说明: ulimit 设置用户进程的资源限制,例如设置文件描述符数的最大值为 1024

umask

为新建的文件和目录设置默认权限

  • 示例: umask 0022
  • 说明: umask 设置新创建文件和目录的默认权限掩码,例如设置默认掩码为 0022

unalias

刪除指定的别名

  • 示例: unalias ll
  • 说明: unalias 删除指定的命令别名,例如删除 ll 的别名

unset

刪除指定的环境变量或 shell 属性

  • 示例: unset PATH
  • 说明: unset 删除指定的环境变量或 shell 的属性,例如删除 PATH 环境变量

wait

等待指定的进程完成,并返回退出状态码

  • 示例: wait %1
  • 说明: wait 等待指定的后台进程完成并返回退出状态码,例如等待标识符为 %1 的作业完成

  • 4
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值