Bash编程实用参考与示例详解
在Bash编程中,有许多实用的功能和工具可以提高我们的工作效率。下面我们将详细介绍一些重要的内容,包括字符类、扩展模式匹配运算符、转义序列、Readline配置以及Bash自带的示例。
1. POSIX字符类
POSIX字符类可以在[]中使用,例如[[:alnum:]]。以下是一些常用的POSIX字符类:
-[[:alnum:]]:字母和数字
-[[:alpha:]]:字母
-[[:ascii:]]:ASCII字符
-[[:blank:]]:空格和制表符
-[[:cntrl:]]:控制字符
-[[:digit:]]:数字
-[[:graph:]]:可打印的非空白字符
-[[:lower:]]:小写字母
-[[:print:]]:可打印字符
-[[:punct:]]:标点符号
-[[:space:]]:空白字符
-[[:upper:]]:大写字母
-[[:word:]]:字母、数字和下划线
-[[:xdigit:]]:十六进制数字
此外,[=c=]匹配所有与字符c具有相同排序权重(由当前区域设置定义)的字符,而[.symbol.]匹配排序符号symbol。这些字符类受区域设置的影响。若要使用传统的Unix值,可以使用LC_COLLATE=C或LC_ALL=C。
2. extglob扩展模式匹配运算符
当使用shopt -s extglob时,可以使用以下扩展模式匹配运算符。匹配默认是区分大小写的,但可以使用shopt -s nocasematch(bash 3.1+)来改变这一行为。该选项会影响case和[[命令。
| 分组 | 含义 |
|---|---|
@( ... ) | 仅出现一次 |
*( ... ) | 零次或多次出现 |
+( ... ) | 一次或多次出现 |
?( ... ) | 零次或一次出现 |
!( ... ) | 除这些之外的任何情况 |
3. tr转义序列
tr命令中的转义序列有特定的含义,如下表所示:
| 序列 | 含义 |
|---|---|
\ooo | 八进制值为ooo(1 - 3个八进制数字)的字符 |
\\ | 反斜杠字符(即对反斜杠本身进行转义) |
\a | “可听”铃声,ASCII BEL字符(因为“b”已用于退格) |
\b | 退格 |
\f | 换页 |
\n | 换行 |
\r | 回车 |
\t | 制表符(有时称为水平制表符) |
\v | 垂直制表符 |
4. Readline初始化文件语法
GNU Readline库为我们提供了与bash和其他GNU实用程序进行交互的命令行。它具有强大的可配置性,但很多人可能并不了解。我们可以通过在初始化文件中使用set命令来修改Readline的运行时行为,语法如下:
set variable value例如,将默认的类似Emacs的键绑定更改为使用vi行编辑命令:
set editing-mode vi变量名和值在适当的情况下不区分大小写,未识别的变量名会被忽略。布尔变量(可以设置为on或off)在值为空、on(不区分大小写)或1时设置为on,其他值则设置为off。
以下是一些常见的Readline配置设置:
| 变量 | 描述 |
|---|---|
bell-style | 控制Readline想要响铃时的行为。设置为none时,Readline从不响铃;设置为visible时,若有可见铃声则使用;设置为audible(默认)时,尝试响铃。 |
bind-tty-special-chars | 设置为on时,Readline尝试将内核终端驱动特殊处理的控制字符绑定到其Readline等效字符。 |
comment-begin | 执行插入注释命令时在行首插入的字符串,默认值为#。 |
completion-ignore-case | 设置为on时,Readline进行文件名匹配和补全时不区分大小写,默认值为off。 |
completion-query-items | 确定何时询问用户是否显示可能补全列表的可能补全数量。若可能补全数量大于此值,Readline会询问用户是否查看;否则直接列出。该变量必须设置为大于或等于0的整数值,负值表示Readline永远不询问,默认限制为100。 |
convert-meta | 设置为on时,Readline会将设置了第八位的字符转换为ASCII键序列,通过去除第八位并添加Esc字符前缀,将其转换为带有元前缀的键序列,默认值为on。 |
disable-completion | 设置为on时,Readline会禁止单词补全,补全字符会像映射到自插入一样插入到行中,默认值为off。 |
editing-mode | 控制使用的默认键绑定集。默认情况下,Readline以Emacs编辑模式启动,其中按键操作与Emacs最相似。该变量可以设置为emacs或vi。 |
enable-keypad | 设置为on时,Readline在被调用时会尝试启用应用程序小键盘,某些系统需要此设置才能启用箭头键,默认值为off。 |
expand-tilde | 设置为on时,Readline尝试单词补全时会执行波浪号(~)扩展,默认值为off。 |
history-preserve-point | 设置为on时,历史记录代码会尝试将光标位置(当前光标所在位置)放置在通过previous-history或next-history检索的每个历史记录行的相同位置,默认值为off。 |
horizontal-scroll-mode | 该变量可以设置为on或off。设置为on时,当编辑的行比屏幕宽度长时,文本将在单个屏幕行上水平滚动,而不是换行到新的屏幕行,默认值为off。 |
input-meta | 设置为on时,Readline将启用八位输入(它不会清除读取字符中的第八位),无论终端声称它支持什么,默认值为off。meta-flag是此变量的同义词。 |
isearch-terminators | 应终止增量搜索而不随后将字符作为命令执行的字符字符串。如果此变量未赋值,Esc和C-J会终止增量搜索。 |
keymap | 设置Readline用于键绑定命令的当前键盘映射。可接受的键盘映射名称有emacs、emacs-standard、emacs-meta、emacs-ctlx、vi、vi-move、vi-command和vi-insert。vi等同于vi-command;emacs等同于emacs-standard。默认值为emacs。editing-mode变量的值也会影响默认键盘映射。 |
mark-directories | 设置为on时,补全的目录名会追加斜杠,默认值为on。 |
mark-modified-lines | 设置为on时,Readline会在已修改的历史记录行开头显示星号(*),默认值为off。 |
mark-symlinked-directories | 设置为on时,补全的符号链接到目录的名称会追加斜杠(受mark-directories值的影响),默认值为off。 |
match-hidden-files | 设置为on时,Readline在执行文件名补全时会匹配以.开头的文件(隐藏文件),除非用户在要补全的文件名中提供了前导.,默认值为on。 |
output-meta | 设置为on时,Readline将直接显示设置了第八位的字符,而不是作为带有元前缀的转义序列,默认值为off。 |
page-completions | 设置为on时,Readline使用内部类似more的分页器一次显示一屏幕的可能补全,默认值为on。 |
print-completions-horizontally | 设置为on时,Readline将按字母顺序水平排序显示补全结果,而不是垂直显示,默认值为off。 |
show-all-if-ambiguous | 改变补全函数的默认行为。设置为on时,有多个可能补全的单词会立即列出匹配项,而不是响铃,默认值为off。 |
show-all-if-unmodified | 以类似于show-all-if-ambiguous的方式改变补全函数的默认行为。设置为on时,没有可能的部分补全(可能的补全没有共同前缀)的多个可能补全的单词会立即列出匹配项,而不是响铃,默认值为off。 |
visible-stats | 设置为on时,列出可能补全时会在文件名后追加表示文件类型的字符,默认值为off。 |
5. Emacs模式命令
在Readline的Emacs编辑模式下,有许多实用的命令,如下表所示:
| 命令 | 含义 |
|---|---|
Ctrl-A | 移动到行首 |
Ctrl-B | 向后移动一个字符 |
Ctrl-D | 向前删除一个字符 |
Ctrl-E | 移动到行尾 |
Ctrl-F | 向前移动一个字符 |
Ctrl-G | 中止当前编辑命令并响铃 |
Ctrl-J | 等同于回车 |
Ctrl-K | 向前删除(剪切)到行尾 |
Ctrl-L | 清屏并重新显示当前行 |
Ctrl-M | 等同于回车 |
Ctrl-N | 命令历史记录中的下一行 |
Ctrl-O | 等同于回车,然后显示历史记录文件中的下一行 |
Ctrl-P | 命令历史记录中的上一行 |
Ctrl-R | 向后搜索 |
Ctrl-S | 向前搜索 |
Ctrl-T | 交换两个字符的位置 |
Ctrl-U | 从光标位置向后删除到行首 |
Ctrl-V | 使下一个输入的字符按字面意思处理 |
Ctrl-V Tab | 插入一个制表符 |
Ctrl-W | 删除光标前的单词,以空白字符为边界 |
Ctrl-X / | 列出当前单词的可能文件名补全 |
Ctrl-X ~ | 列出当前单词的可能用户名补全 |
Ctrl-X $ | 列出当前单词的可能shell变量补全 |
Ctrl-X @ | 列出当前单词的可能主机名补全 |
Ctrl-X ! | 列出当前单词的可能命令名补全 |
Ctrl-X ( | 开始将字符保存到当前键盘宏中 |
Ctrl-X ) | 停止将字符保存到当前键盘宏中 |
Ctrl-X e | 重新执行最后定义的键盘宏 |
Ctrl-X Ctrl-R | 读取Readline初始化文件的内容 |
Ctrl-X Ctrl-V | 显示当前bash实例的版本信息 |
Ctrl-Y | 恢复(粘贴)最后删除的项 |
Delete | 向后删除一个字符 |
Ctrl-[ | 等同于Esc(大多数键盘) |
Esc-B | 向后移动一个单词 |
Esc-C | 将光标后的单词转换为大写 |
Esc-D | 向前删除一个单词 |
Esc-F | 向前移动一个单词 |
Esc-L | 将光标后的单词转换为小写 |
Esc-N | 非增量向前搜索 |
Esc-P | 非增量向后搜索 |
Esc-R | 撤销对当前行所做的所有更改 |
Esc-T | 交换两个单词的位置 |
Esc-U | 将光标后的单词转换为大写 |
Esc-Ctrl-E | 对当前行执行shell别名、历史记录和单词扩展 |
Esc-Ctrl-H | 向后删除一个单词 |
Esc-Ctrl-Y | 在光标位置插入上一个命令的第一个参数(通常是第二个单词) |
Esc-Delete | 向后删除一个单词 |
Esc-^ | 对当前行执行历史记录扩展 |
Esc-< | 移动到历史记录文件的第一行 |
Esc-> | 移动到历史记录文件的最后一行 |
Esc-. | 在光标位置插入上一个命令行的最后一个单词 |
Esc-_ | 等同于Esc-. |
Tab | 尝试对当前单词进行文件名补全 |
Esc-? | 列出光标前文本的可能补全 |
Esc-/ | 尝试对当前单词进行文件名补全 |
Esc-~ | 尝试对当前单词进行用户名补全 |
Esc-$ | 尝试对当前单词进行变量补全 |
Esc-@ | 尝试对当前单词进行主机名补全 |
Esc-! | 尝试对当前单词进行命令名补全 |
Esc-Tab | 尝试从命令历史记录中的文本进行补全 |
Esc-~ | 尝试对当前单词进行波浪号扩展 |
Esc-\ | 删除光标周围的所有空格和制表符 |
Esc-* | 在光标前插入Esc-=会生成的所有补全项 |
Esc-= | 列出光标前的可能补全 |
Esc-{ | 尝试对当前单词进行文件名补全,并将结果以大括号括起来返回给shell |
6. vi控制模式命令
在Readline的vi控制模式下,也有一系列实用的命令,如下表所示:
| 命令 | 含义 |
|---|---|
h | 向左移动一个字符 |
l | 向右移动一个字符 |
w | 向右移动一个单词 |
b | 向左移动一个单词 |
W | 移动到下一个非空白单词的开头 |
B | 移动到前一个非空白单词的开头 |
e | 移动到当前单词的末尾 |
E | 移动到当前非空白单词的末尾 |
0 | 移动到行首 |
. | 重复上一次的插入操作 |
^ | 移动到行中的第一个非空白字符 |
$ | 移动到行尾 |
i | 在当前字符前插入文本 |
a | 在当前字符后插入文本 |
I | 在行首插入文本 |
A | 在行尾插入文本 |
R | 覆盖现有文本 |
dh | 向后删除一个字符 |
dl | 向前删除一个字符 |
db | 向后删除一个单词 |
dw | 向前删除一个单词 |
dB | 向后删除一个非空白单词 |
dW | 向前删除一个非空白单词 |
d$ | 删除到行尾 |
d0 | 删除到行首 |
D | 等同于d$(删除到行尾) |
dd | 等同于0d$(删除整行) |
C | 等同于c$(删除到行尾,进入输入模式) |
cc | 等同于0c$(删除整行,进入输入模式) |
x | 等同于dl(向前删除字符) |
X | 等同于dh(向后删除字符) |
k或- | 向上移动一行 |
j或+ | 向下移动一行 |
G | 移动到由重复计数指定的行 |
/string | 向前搜索字符串string |
?string | 向后搜索字符串string |
n | 重复向前搜索 |
N | 重复向后搜索 |
fx | 向右移动到下一个字符x的位置 |
Fx | 向左移动到上一个字符x的位置 |
tx | 向右移动到下一个字符x的位置,然后后退一个空格 |
Tx | 向左移动到上一个字符x的位置,然后前进一个空格 |
; | 重复上一次的字符查找命令 |
, | 以相反方向重复上一次的字符查找命令 |
\ | 进行文件名补全 |
* | 进行通配符扩展(到命令行) |
\= | 进行通配符扩展(作为打印列表) |
~ | 反转(切换)当前字符的大小写 |
\ | 追加前一个命令的最后一个单词,进入输入模式 |
Ctrl-L | 开始新行并在其上重绘当前行 |
# | 在行首添加#(注释字符)并将其发送到历史记录 |
7. ASCII值表
ASCII表在处理字符和转义序列时非常有用,以下是部分ASCII值表:
| Int | Octal | Hex | ASCII |
|---|---|---|---|
| 0 | 000 | 00 | ^@ |
| 1 | 001 | 01 | ^A |
| 2 | 002 | 02 | ^B |
| 3 | 003 | 03 | ^C |
| 4 | 004 | 04 | ^D |
| 5 | 005 | 05 | ^E |
| 6 | 006 | 06 | ^F |
| 7 | 007 | 07 | ^G |
| 8 | 010 | 08 | ^H |
| 9 | 011 | 09 | ^I |
| 10 | 012 | 0a | ^J |
| 11 | 013 | 0b | ^K |
| 12 | 014 | 0c | ^L |
| 13 | 015 | 0d | ^M |
| 14 | 016 | 0e | ^N |
| 15 | 017 | 0f | ^O |
| 16 | 020 | 10 | ^P |
| 17 | 021 | 11 | ^Q |
| 18 | 022 | 12 | ^R |
| 19 | 023 | 13 | ^S |
| 20 | 024 | 14 | ^T |
| 21 | 025 | 15 | ^U |
| 22 | 026 | 16 | ^V |
| 23 | 027 | 17 | ^W |
| 24 | 030 | 18 | ^X |
| 25 | 031 | 19 | ^Y |
| 26 | 032 | 1a | ^Z |
| 27 | 033 | 1b | ^[ |
| 28 | 034 | 1c | ^\ |
| 29 | 035 | 1d | ^] |
| 30 | 036 | 1e | ^^ |
| 31 | 037 | 1f | ^_ |
| 32 | 040 | 20 | |
| 33 | 041 | 21 | ! |
| 34 | 042 | 22 | " |
| 35 | 043 | 23 | # |
| 36 | 044 | 24 | $ |
| 37 | 045 | 25 | % |
| 38 | 046 | 26 | & |
| 39 | 047 | 27 | ‘ |
| 40 | 050 | 28 | ( |
| 41 | 051 | 29 | ) |
| 42 | 052 | 2a | * |
| 43 | 053 | 2b | + |
| 44 | 054 | 2c | , |
| 45 | 055 | 2d | - |
| 46 | 056 | 2e | . |
| 47 | 057 | 2f | / |
| 48 | 060 | 30 | 0 |
| 49 | 061 | 31 | 1 |
| 50 | 062 | 32 | 2 |
| 51 | 063 | 33 | 3 |
| 52 | 064 | 34 | 4 |
| 53 | 065 | 35 | 5 |
| 54 | 066 | 36 | 6 |
| 55 | 067 | 37 | 7 |
| 56 | 070 | 38 | 8 |
| 57 | 071 | 39 | 9 |
| 58 | 072 | 3a | : |
| 59 | 073 | 3b | ; |
| 60 | 074 | 3c | < |
| 61 | 075 | 3d | = |
| 62 | 076 | 3e | > |
| 63 | 077 | 3f | ? |
| 64 | 100 | 40 | @ |
| 65 | 101 | 41 | A |
| 66 | 102 | 42 | B |
| 67 | 103 | 43 | C |
| 68 | 104 | 44 | D |
| 69 | 105 | 45 | E |
| 70 | 106 | 46 | F |
| 71 | 107 | 47 | G |
| 72 | 110 | 48 | H |
| 73 | 111 | 49 | I |
| 74 | 112 | 4a | J |
| 75 | 113 | 4b | K |
| 76 | 114 | 4c | L |
| 77 | 115 | 4d | M |
| 78 | 116 | 4e | N |
| 79 | 117 | 4f | O |
| 80 | 120 | 50 | P |
| 81 | 121 | 51 | Q |
| 82 | 122 | 52 | R |
| 83 | 123 | 53 | S |
| 84 | 124 | 54 | T |
| 85 | 125 | 55 | U |
| 86 | 126 | 56 | V |
| 87 | 127 | 57 | W |
| 88 | 130 | 58 | X |
| 89 | 131 | 59 | Y |
| 90 | 132 | 5a | Z |
| 91 | 133 | 5b | [ |
| 92 | 134 | 5c | \ |
| 93 | 135 | 5d | ] |
| 94 | 136 | 5e | ^ |
| 95 | 137 | 5f | _ |
| 96 | 140 | 60 | ` |
| 97 | 141 | 61 | a |
| 98 | 142 | 62 | b |
| 99 | 143 | 63 | c |
| 100 | 144 | 64 | d |
| 101 | 145 | 65 | e |
| 102 | 146 | 66 | f |
| 103 | 147 | 67 | g |
| 104 | 150 | 68 | h |
| 105 | 151 | 69 | i |
| 106 | 152 | 6a | j |
| 107 | 153 | 6b | k |
| 108 | 154 | 6c | l |
| 109 | 155 | 6d | m |
| 110 | 156 | 6e | n |
| 111 | 157 | 6f | o |
| 112 | 160 | 70 | p |
| 113 | 161 | 71 | q |
| 114 | 162 | 72 | r |
| 115 | 163 | 73 | s |
| 116 | 164 | 74 | t |
| 117 | 165 | 75 | u |
| 118 | 166 | 76 | v |
| 119 | 167 | 77 | w |
| 120 | 170 | 78 | x |
| 121 | 171 | 79 | y |
| 122 | 172 | 7a | z |
| 123 | 173 | 7b | { |
| 124 | 174 | 7c | | |
| 125 | 175 | 7d | } |
| 126 | 176 | 7e | ~ |
| 127 | 177 | 7f | ^? |
Bash编程实用参考与示例详解
8. Bash自带示例
Bash的压缩包归档中包含一个examples目录,非常值得探索。该目录包含示例代码、脚本、函数和启动文件。
8.1 启动文件目录示例
startup - files目录:提供了许多可用于自定义启动文件的示例。其中,bash_aliases包含很多有用的别名。不过要注意,如果直接复制这些文件,需要根据自己的系统进行编辑,因为很多路径可能不同。functions目录:包含许多实用的函数定义,例如:basename:一些系统中缺失的basename实用程序的实现。dirfuncs:目录操作功能。dirname:一些系统中缺失的dirname实用程序的实现。whatis:第十版Bourne shellwhatis内置命令的实现。whence:Korn shellwhence内置命令的近似克隆。- 对于有Korn shell使用经验的人来说,
kshenv可能特别有用,它包含了一些常见Korn功能(如whence、print和双参数cd内置命令)的函数定义。
scripts目录:包含许多Bash脚本示例。其中两个较大的脚本展示了使用shell脚本可以实现的复杂功能,一个是(相当有趣的)冒险游戏解释器,另一个是C shell解释器。其他脚本包括优先级规则示例、滚动文本显示、“旋转轮”进度显示以及如何提示用户输入特定类型的答案等。
以下是bash 3.1及更高版本中相关路径和描述的索引表:
| Path | Description | X - ref |
| ---- | ---- | ---- |
|./bashdb| 已弃用的bash调试器示例实现 | |
|./complete| shell补全代码 | |
|./functions| 示例函数 | |
|./functions/array - stuff| 各种数组函数(如ashift、array_sort、reverse) | |
|./functions/array - to - string| 将数组转换为字符串 | |
|./functions/autoload| 几乎与ksh兼容的autoload(无懒加载) | ksh |
|./functions/autoload.v2| 几乎与ksh兼容的autoload(无懒加载) | ksh |
|./functions/autoload.v3| 更与ksh兼容的autoload(有懒加载) | ksh |
|./functions/basename|basename(1)的替代实现 | basename |
|./functions/basename2| 用于bash/sh的快速basename(1)和dirname(1)函数 | basename, dirname |
|./functions/coproc.bash| 启动、控制和结束协进程 | |
|./functions/coshell.bash| 控制shell协进程(参见coproc.bash) | |
|./functions/coshell.README|coshell和coproc的README文件 | |
|./functions/csh - compat| C - shell兼容性包 | csh |
|./functions/dirfuncs| 《The Korn Shell》一书中的目录操作函数 | |
|./functions/dirname|dirname(1)的替代实现 | dirname |
|./functions/emptydir| 确定目录是否为空 | |
|./functions/exitstat| 显示进程的退出状态 | |
|./functions/external| 类似于command,但强制使用外部命令 | |
|./functions/fact| 递归阶乘函数 | |
|./functions/fstty| 同步TERM更改到stty(1)和readlinebind的前端 | stty.bash |
|./functions/func| 打印参数指定的函数定义 | |
|./functions/gethtml| 从远程服务器获取网页(bash版的wget(1)) | |
|./functions/getoptx.bash| 解析长选项的getopt函数 | |
|./functions/inetaddr| 互联网地址转换(inet2hex和hex2inet) | |
|./functions/inpath| 如果参数在PATH中且可执行,则返回零 | inpath |
|./functions/isnum.bash| 测试用户输入是数字还是字符值 | |
|./functions/isnum2| 测试用户输入的数值,包括浮点数 | |
|./functions/isvalidip| 测试用户输入的是否为有效的IP地址 | |
|./functions/jdate.bash| 儒略日期转换 | |
|./functions/jj.bash| 查找正在运行的作业 | |
|./functions/keep| 尝试将某些程序保持在前台并运行 | |
|./functions/ksh - cd| 类似ksh的cd:cd [-LP] [dir [change]]| ksh |
|./functions/ksh - compat - test| 类似ksh的算术测试替代方案 | ksh |
|./functions/kshenv| 为bash提供ksh环境基础的函数和别名 | ksh |
|./functions/login| 替换旧Bourne shell中的login和newgrp内置命令 | |
|./functions/lowercase| 将文件名重命名为小写 | rename lower |
|./functions/manpage| 查找并打印手册页 | fman |
|./functions/mhfold| 打印MH文件夹,仅在folders(1)不打印修改日期/时间时有用 | |
|./functions/notify.bash| 作业状态改变时通知 | |
|./functions/pathfuncs| 与路径相关的函数(如no_path、add_path、pre - path、del_path) | path |
|./functions/README| README文件 | |
|./functions/recurse| 递归目录遍历器 | |
|./functions/repeat2| C shell内置repeat的克隆 | repeat, csh |
|./functions/repeat3| C shell内置repeat的克隆 | repeat, csh |
|./functions/seq| 生成从m到n的序列;m默认为1 | |
|./functions/seq2| 生成从m到n的序列;m默认为1 | |
|./functions/shcat| 基于readline的分页器 | cat, readline pager |
|./functions/shcat2| 基于readline的分页器 | cat, readline pager |
|./functions/sort - pos - params| 对位置参数进行排序 | |
|./functions/substr| 模拟古老ksh内置命令的函数 | ksh |
|./functions/substr2| 模拟古老ksh内置命令的函数 | ksh |
|./functions/term| 交互式或非交互式设置终端类型的shell函数 | |
|./functions/whatis| 第十版Unix sh内置whatis(1)命令的实现 | |
|./functions/whence| 几乎与ksh兼容的whence(1)命令 | |
|./functions/which| 模仿FreeBSD中的which(1)| |
|./functions/xalias.bash| 将csh别名命令转换为bash函数 | csh, aliasconv |
|./functions/xfind.bash|find(1)的克隆 | |
|./loadables/| 示例可加载替换模块 | |
|./loadables/basename.c| 返回路径名的非目录部分 | basename |
|./loadables/cat.c| 无选项的cat(1)替换实现——这是cat原本的意图 | cat, readline pager |
|./loadables/cut.c|cut(1)的替换实现 | |
|./loadables/dirname.c| 返回路径名的目录部分 | dirname |
|./loadables/finfo.c| 打印文件信息 | |
|./loadables/getconf.c| POSIX.2getconf实用程序 | |
|./loadables/getconf.h| 系统未提供的替换定义 | |
|./loadables/head.c| 复制文件的开头部分 | |
|./loadables/hello.c| 必备的“Hello World”/示例可加载模块 | |
|./loadables/id.c| POSIX.2用户身份 | |
|./loadables/ln.c| 创建链接 | |
|./loadables/logname.c| 打印当前用户的登录名 | |
|./loadables/Makefile.in| 示例可加载内置命令的简单makefile | |
|./loadables/mkdir.c| 创建目录 | |
|./loadables/necho.c| 无选项或参数解释的echo| |
|./loadables/pathchk.c| 检查路径名的有效性和可移植性 | |
|./loadables/print.c| 可加载的ksh - 93风格print内置命令 | |
|./loadables/printenv.c| BSDprintenv(1)的最小内置克隆 | |
|./loadables/push.c| 有人记得TOPS - 20吗? | |
|./loadables/README| README文件 | |
|./loadables/realpath.c| 规范化路径名,解析符号链接 | |
|./loadables/rmdir.c| 删除目录 | |
|./loadables/sleep.c| 睡眠几分之一秒 | |
|./loadables/strftime.c| 可加载的strftime(3)内置接口 | |
|./loadables/sync.c| 通过强制挂起的文件系统写入完成来同步磁盘 | |
|./loadables/tee.c| 复制标准输入 | |
|./loadables/template.c| 可加载内置命令的示例模板 | |
|./loadables/truefalse.c| 真和假内置命令 | |
|./loadables/tty.c| 返回终端名称 | |
|./loadables/uname.c| 打印系统信息 | |
|./loadables/unlink.c| 删除目录项 | |
|./loadables/whoami.c| 打印当前用户的用户名 | |
|./loadables/perl/| 演示如何将Perl解释器集成到bash中 | |
|./misc| 杂项 | |
|./misc/aliasconv.bash| 将csh别名转换为bash别名和函数 | csh, xalias |
|./misc/aliasconv.sh| 将csh别名转换为bash别名和函数 | csh, xalias |
|./misc/cshtobash| 将csh别名、环境变量和变量转换为bash等效项 | csh, xalias |
|./misc/README| README文件 | |
|./misc/suncmd.termcap| SunView TERMCAP字符串 | |
|./obashdb| Bill Rosenblatt的《Learning the Korn Shell》中Korn Shell调试器的修改版本 | |
|./scripts.noah| Noah Friedman的脚本集合(由Chet Ramey更新为bash v2语法) | |
|./scripts.noah/aref.bash| 伪数组和子字符串索引示例 | |
|./scripts.noah/bash.sub.bash|require.bash使用的库函数 | |
|./scripts.noah/bash_version.| bash | 一个分割$BASH_VERSION的函数 | |
|./scripts.noah/meta.bash| 启用和禁用八位readline输入 | |
|./scripts.noah/mktmp.bash| 创建具有唯一名称的临时文件 | |
|./scripts.noah/number.bash| 一个有趣的将数字转换为英语的技巧 | |
|./scripts.noah/PERMISSION| 使用此目录中脚本的权限 | |
|./scripts.noah/prompt.bash| 将PS1设置为预定义字符串的方法 | |
|./scripts.noah/README| README文件 | |
|./scripts.noah/remap_keys.| bash | 重新进行readline绑定的前端 | readline |
|./scripts.noah/require.bash| bash的类似Lisp的require/provide库函数 | |
|./scripts.noah/send_mail.| bash | 用bash编写的替代SMTP客户端 | |
|./scripts.noah/shcat.bash| bash版的cat(1)替换实现 | cat |
|./scripts.noah/source.bash| 使用当前目录的source替换实现 | |
|./scripts.noah/string.bash| shell级别的string(3)函数 | |
|./scripts.noah/stty.bash| 更改readline绑定的stty(1)前端 | fstty |
|./scripts.noah/y_or_n_p.| bash | 提示用户输入是/否/退出答案 | ask |
|./scripts.v2| John DuBois的ksh脚本集合(由Chet Ramey转换为bash v2语法) | |
|./scripts.v2/arc2tarz| 将arc归档转换为压缩的tar归档 | |
|./scripts.v2/bashrand| 具有上下限和可选种子的随机数生成器 | random |
|./scripts.v2/cal2day.bash| 将日期编号转换为名称 | |
|./scripts.v2/cdhist.bash| 带有目录栈的cd替换实现 | |
|./scripts.v2/corename| 确定核心文件的生成原因 | |
|./scripts.v2/fman| 快速的man(1)替换实现 | manpage |
|./scripts.v2/frcp| 使用ftp(1)复制文件,但使用rcp类型的命令行语法 | |
|./scripts.v2/lowercase| 将文件名更改为小写 | rename lower |
|./scripts.v2/ncp|cp(1)的更好前端(具有-i等选项) | |
|./scripts.v2/newext| 更改一组文件的扩展名 | rename |
|./scripts.v2/nmv|mv(1)的更好前端(具有-i等选项) | rename |
|./scripts.v2/pages| 打印文件的指定页面 | |
|./scripts.v2/PERMISSION| 使用此目录中脚本的权限 | |
|./scripts.v2/pf| 处理压缩文件的分页器前端 | |
|./scripts.v2/pmtop| SunOS 4.x和BSD/OS的简易top(1)| |
|./scripts.v2/README| README文件 | |
|./scripts.v2/ren| 通过更改匹配模式的文件名部分来重命名文件 | rename |
|./scripts.v2/rename| 更改匹配模式的文件名 | rename |
|./scripts.v2/repeat| 多次执行命令 | repeat |
|./scripts.v2/shprof| bash脚本的行分析器 | |
|./scripts.v2/untar| 将(可能压缩的)tar文件解压缩到目录中 | |
|./scripts.v2/uudec| 小心地对多个文件进行uudecode(1)| |
|./scripts.v2/uuenc| 对多个文件进行uuencode(1)| |
|./scripts.v2/vtree| 打印目录树的可视化显示 | tree |
|./scripts.v2/where| 显示匹配模式的命令所在位置 | |
|./scripts| 示例脚本 | |
|./scripts/adventure.sh| bash编写的文本冒险游戏! | |
|./scripts/bcsh.sh| Bourne shell的C shell解释器 | csh |
|./scripts/cat.sh| 基于readline的分页器 | cat, readline pager |
|./scripts/center| 居中一组行 | |
|./scripts/dd - ex.sh| 仅使用/bin/sh、/bin/dd和/bin/rm的行编辑器 | |
|./scripts/fixfiles.bash| 递归遍历树并修复包含各种坏字符的文件 | |
|./scripts/hanoi.bash| 不可避免的bash版汉诺塔问题 | |
|./scripts/inpath| 在$PATH中搜索与$1同名的文件;如果找到则返回TRUE | inpath |
|./scripts/krand.bash| 生成整数范围内的随机数 | random |
|./scripts/line - input.bash| GNU Bourne Again Shell的行输入例程和终端控制原语 | |
|./scripts/nohup.bash| bash版的nohup命令 | |
|./scripts/precedence| 测试&&和||运算符的相对优先级 | |
|./scripts/randomcard.bash| 从一副牌中打印一张随机牌 | random |
|./scripts/README| README文件 | |
|./scripts/scrollbar| 显示滚动文本 | |
|./scripts/scrollbar2| 显示滚动文本 | |
|./scripts/self - repro| 自我复制脚本(小心使用) | |
|./scripts/showperm.bash| 将ls(1)的符号权限转换为八进制模式 | |
|./scripts/shprompt| 显示提示并获取满足特定条件的答案 | ask |
|./scripts/spin.bash| 显示旋转轮以显示进度 | |
|./scripts/timeout| 为rsh(1)设置更短的超时时间 | |
|./scripts/vtree2| 显示目录的树状打印,包含1k块的磁盘使用情况 | tree |
|./scripts/vtree3| 显示目录的图形化树状打印 | tree |
|./scripts/vtree3a| 显示目录的图形化树状打印 | tree |
|./scripts/websrv.sh| bash编写的Web服务器! | |
|./scripts/xterm_title| 打印xterm标题栏的内容 | |
|./scripts/zprintf| 模拟printf(自printf成为bash内置命令后已过时) | |
|./startup - files| 示例启动文件 | |
|./startup - files/Bash_aliases| 一些有用的别名(由Fox编写) | |
|./startup - files/Bash_profile| bash登录shell的示例启动文件(由Fox编写) | |
|./startup - files/bash - profile| bash登录shell的示例启动文件(由Ramey编写) | |
|./startup - files/bashrc| 示例Bourne Again Shell初始化文件(由Ramey编写) | |
|./startup - files/Bashrc.bfox| 示例Bourne Again Shell初始化文件(由Fox编写) | |
|./startup - files/README| README文件 | |
|./startup - files/apple| Mac OS X的示例启动文件 | |
|./startup - files/apple/aliases| Mac OS X的示例别名 | |
|./startup - files/apple/bash.| defaults | 示例用户首选项文件 | |
|./startup - files/apple/| environment | 示例Bourne Again Shell环境文件 | |
|./startup - files/apple/login| 示例登录包装器 | |
|./startup - files/apple/logout| 示例注销包装器 | |
|./startup - files/apple/rc| 示例Bourne Again Shell配置文件 | |
|./startup - files/apple/README| README文件 | |
这些示例不仅可以直接包含在你的环境中,还能为你提供许多可供学习的替代示例。建议你对它们进行实验,以更好地掌握Bash编程。
通过上述介绍,我们详细了解了Bash编程中的字符类、扩展模式匹配运算符、转义序列、Readline配置以及Bash自带的示例等重要内容。这些知识和工具将有助于你更高效地进行Bash编程,提升工作效率。希望你能在实际应用中充分利用这些信息,编写出更加优秀的Bash脚本。
下面是一个简单的mermaid流程图,展示了使用Bash示例脚本的基本流程:
graph LR A[选择示例类型] --> B{脚本或函数} B -->|脚本| C[选择脚本] B -->|函数| D[选择函数] C --> E[编辑脚本以适应系统] D --> F[加载函数到环境] E --> G[执行脚本] F --> H[使用函数]这个流程图展示了从选择示例类型(脚本或函数),到根据选择进行相应操作(编辑脚本、加载函数),最后执行脚本或使用函数的过程。你可以根据自己的需求,按照这个流程来使用Bash自带的示例。