在使用 Bash 时,掌握工作控制和历史指令的用法将大大提高效率。此外,了解 Bash 数组和变量的高级用法也能帮助你更灵活地处理数据。本文将详细介绍这些内容,帮助你提升 Bash 的使用技巧。
Bash 工作控制
Bash 提供了一些非常有用的命令用于管理进程。以下是一些常用的工作控制命令:
%%
或%+
:调用当前正在运行的工作。%-
:调用上一个工作。%n
:将工作编号为n
的进程放到前台执行,等同于fg %n
。%?s1
:查找程序名称中含有s1
的工作,?
表示搜索。%./s1
:查找以./s1
开头的进程。C-z
:暂停当前进程并使用bg
将其移至后台,相当于在命令后加上&
。disown %n
:移除工作,不再受到 shell 的管理。
Bash 历史指令
历史指令让你能够快速重复之前执行的命令:
!-n
:执行倒数第n
个命令。!!
:执行上一个命令。!字符串
:执行最近一个包含该字符串的历史命令。!?字符串?
:执行最近一个包含字符串的历史命令。!#
:获取当前输入的命令字符串。!!:$
:获取上一个命令的最后一个参数。!ls:1
:获取最近一个以ls
开头的命令的第一个参数。!!:3-5
:获取上一个命令中,介于第 3 到 5 的参数。!!:s/字符串1/字符串2/
:将上一个命令中的字符串1
替换为字符串2
。!!:h
:获取前一个命令的目录部分。!!:t
:获取前一个命令的文件名部分。!!:p
:显示上一个命令,但不执行。
Bash 数组用法
在 Bash 中,数组的使用使得处理多个数据变得简单:
- 定义数组:
a=(1 2 3 4 5)
或a=(1 [4]=4 5)
(可以不连续)。 - 获取值:
${a[index]}
。 - 获取所有元素:
${a[@]}
或${a[*]}
。 - 获取元素个数:
${#a[@]}
或${#a[*]}
。
调整 Bash 变量属性为只读
要将变量设置为只读,可以使用以下命令:
readonly 变量名
:设置变量为只读。readonly -p
:显示所有只读变量。readonly -f 函数名
:设置函数为只读。readonly -a 数组名
:将数组设置为只读。declare -r 变量名
:使用declare
设置只读属性。
Bash 高级变量用法
变量使用
${变量名}
:获取变量值。$(命令)
:获取命令的输出。${待测变量:-替换值}
:如果变量不存在或为空,返回替换值。${待测变量:=替换值}
:如果变量不存在或为空,赋值为替换值。${待测变量:?错误信息}
:如果变量不存在或为空,返回错误信息。${待测变量:+替换值}
:如果变量存在且非空,返回替换值。
字符串操作
切片:
${变量:位置起始点}
和${变量:位置起始点:长度}
。计算字符串长度:
${#str}
和expr length "字符串"
。对比与删除:
${变量#样式}
:从前面开始,最短删除。${变量##样式}
:从前面开始,最长删除。${变量%样式}
:从后面开始,最短删除。${变量%%样式}
:从后面开始,最长删除。
取代或删除部分字符串:
- 替换第一个匹配:
${变量/样式/替换字符串}
。 - 替换所有匹配:
${变量//样式/替换字符串}
。 - 只匹配行首:
${变量/#样式/替换字符串}
。 - 只匹配行末:
${变量/%样式/替换字符串}
。 - 删除:不加替换字符串表示删除。
- 替换第一个匹配:
变量名列表
- 列出指定字符串开头的变量名列表:
${!开头字符串@}
和${!开头字符串*}
。 - 获取数组索引列表:
${!数组变量[@]}
和${!数组变量[*]}
。
算术扩展
$((算术式))
、expr 算术式
和let 算术式
。- 支持不同进制数字表示:
基底#数字
。
常用 Shell 命令
- 杀死僵尸进程:
kill -HUP $(ps -A -ostat,ppid | awk '/[zZ]/{print $2}')
FAQ 常见问题
1. 如何将一个后台进程移回前台?
使用命令fg %n
,其中%n
是进程编号。
2. 如何查找历史命令中的特定命令?
使用!?字符串?
查找最近包含该字符串的历史命令。
3. 如何定义一个不连续的数组?
你可以通过a=(1 [4]=4 5)
方式定义不连续数组,索引间的空隙会自动填充为空。
总结
通过了解 Bash 的工作控制、历史指令、数组和变量的高级用法,你可以更加高效地使用 Bash,提升工作效率。熟练运用这些命令和技巧,将使你在处理日常任务时更加得心应手。