From 0bced7ac0f6315e2e13ef258abc7ded32546a24a Mon Sep 17 00:00:00 2001 From: jaywcjlove <398188662@qq.com> Date: Tue, 9 Apr 2024 17:57:37 +0800 Subject: [PATCH] doc: docs/bash.md --- docs/bash.md | 110 +++++++++++++++++++++++++++++++++------------------ 1 file changed, 71 insertions(+), 39 deletions(-) diff --git a/docs/bash.md b/docs/bash.md index 0a6d74d9..2006eada 100644 --- a/docs/bash.md +++ b/docs/bash.md @@ -61,6 +61,7 @@ bash 注释 `$@` | 所有参数,从第一个开始 `$-` | 当前选项 `$_` | 上一个命令的最后一个参数 + 见:[特殊参数](http://wiki.bash-hackers.org/syntax/shellvars#special_parameters_and_shell_variables) @@ -152,6 +153,7 @@ Bash 参数扩展 `${FOO:=val}` | 如果未设置,则将 `$FOO` 设置为 `val` `${FOO:+val}` | `val` 如果设置了`$FOO` `${FOO:?message}` | 如果 `$FOO` 未设置,则显示消息并退出 + ### 替代 Substitution @@ -195,15 +197,21 @@ echo ${name:0:length} # => Jo SRC="/path/to/foo.cpp" ``` +--- + ```bash BASEPATH=${SRC##*/} echo $BASEPATH # => "foo.cpp" +``` +--- + +```bash DIRPATH=${SRC%$BASEPATH} echo $DIRPATH # => "/path/to/" ``` -### Transform +### 转换 ```bash STR="HELLO WORLD!" @@ -265,7 +273,7 @@ for e in "${Fruits[@]}"; do done ``` -#### With index +#### 有索引 ```bash for i in "${!Fruits[@]}"; do @@ -348,12 +356,12 @@ Bash 条件句 条件 | 描述 :- | - -`[[ NUM -eq NUM ]]` | 等于 Equal | -`[[ NUM -ne NUM ]]` | 不等于 Not equal | -`[[ NUM -lt NUM ]]` | 小于 Less than | -`[[ NUM -le NUM ]]` | 小于等于 Less than or equal | -`[[ NUM -gt NUM ]]` | 大于 Greater than | -`[[ NUM -ge NUM ]]` | 大于等于 Greater than or equal | +`[[ NUM -eq NUM ]]` | 等于 Equal +`[[ NUM -ne NUM ]]` | 不等于 Not equal +`[[ NUM -lt NUM ]]` | 小于 Less than +`[[ NUM -le NUM ]]` | 小于等于 Less than or equal +`[[ NUM -gt NUM ]]` | 大于 Greater than +`[[ NUM -ge NUM ]]` | 大于等于 Greater than or equal `(( NUM < NUM ))` | 小于 `(( NUM <= NUM ))` | 小于或等于 `(( NUM > NUM ))` | 比...更大 @@ -448,10 +456,10 @@ fi 条件 | 描述 :- | - -`[[ -o noclobber ]]` | 如果启用 OPTION -`[[ ! EXPR ]]` | 不是 Not -`[[ X && Y ]]` | 和 And -`[[ X \|\| Y ]]` | 或者 Or +`[[ -o noclobber ]]` | 如果启用 OPTION +`[[ ! EXPR ]]` | 不是 Not +`[[ X && Y ]]` | 和 And +`[[ X \|\| Y ]]` | 或者 Or ### 逻辑和,或 @@ -536,10 +544,10 @@ done ```bash for number in $(seq 1 3); do if [[ $number == 2 ]]; then - # Skip entire rest of loop. + # 跳过整个循环的其余部分。 break; fi - # This will only print 1 + # 这只会打印 1 echo "$number" done ``` @@ -558,7 +566,7 @@ done ```bash while true; do - # here is some code. + # 下面是一些代码 done ``` @@ -566,7 +574,7 @@ done ```bash while :; do - # here is some code. + # 下面是一些代码 done ``` @@ -589,8 +597,9 @@ myfunc() { } ``` +同上(替代语法) + ```bash -# 同上(替代语法) function myfunc() { echo "hello $1" } @@ -635,42 +644,61 @@ Bash 选项 ### 选项 +避免覆盖文件 + ```bash -# 避免覆盖文件 # (echo "hi" > foo) set -o noclobber +``` -# 用于出错时退出 -# 避免级联错误 +用于出错时退出,避免级联错误 + +```bash set -o errexit +``` -# 揭示隐藏的失败 +揭示隐藏的失败 + +```bash set -o pipefail +``` -# 公开未设置的变量 +公开未设置的变量 + +```bash set -o nounset ``` ### 全局选项 +不匹配的 glob 被删除 + ```bash -# 不匹配的 glob 被删除 -# ('*.foo' => '') -shopt -s nullglob +shopt -s nullglob # ('*.foo' => '') +``` -# 不匹配的 glob 抛出错误 +不匹配的 glob 抛出错误 + +```bash shopt -s failglob +``` -# 不区分大小写的球体 +不区分大小写的球体 + +```bash shopt -s nocaseglob +``` -# 通配符匹配点文件 -# ("*.sh" => ".foo.sh") -shopt -s dotglob +通配符匹配点文件 -# 允许 ** 进行递归匹配 -# ('lib/**/*.rb' => 'lib/a/b/c.rb') -shopt -s globstar +```bash +shopt -s dotglob # ("*.sh" => ".foo.sh") +``` + +允许 ** 进行递归匹配 + +```bash +shopt -s globstar # ('lib/**/*.rb' => 'lib/a/b/c.rb') ``` Bash 历史 @@ -682,8 +710,9 @@ Bash 历史 命令 | 描述 :- | - `history` | 显示历史 -`sudo !!` | 使用 sudo 运行上一个命令 +`sudo !!` | 使用 `sudo` 运行上一个命令 `shopt -s histverify` | 不要立即执行扩展结果 + ### 表达式 @@ -694,6 +723,7 @@ Bash 历史 `!-n` | 展开第 `n` 个最近的命令 `!n` | 展开历史中的第 `n` 个命令 `!` | 展开最近调用的命令 `` + ### 操作 @@ -704,6 +734,7 @@ Bash 历史 `!!:gs///` | 在最近的命令中将所有出现的 `` 替换为 `` `!$:t` | 仅从最近命令的最后一个参数扩展基本名称 `!$:h` | 仅从最近命令的最后一个参数展开目录 + `!!` 和 `!$` 可以替换为任何有效的扩展。 @@ -716,34 +747,35 @@ Bash 历史 `!$` | 从最近的命令中展开最后一个标记 `!!:n-m` | 从最近的命令扩展令牌范围 `!!:n-$` | 从最近的命令中将第 `n` 个标记展开到最后 + `!!` 可以替换为任何有效的扩展,即 `!cat`、`!-2`、`!42` 等。 杂项 -------------- +--- ### 数值计算 ```bash -$((a + 200)) # Add 200 to $a +$((a + 200)) # $a 加 200 ``` ```bash -$(($RANDOM%200)) # Random number 0..199 +$(($RANDOM%200)) # 随机数 0..199 ``` ### 子 shell ```bash (cd somedir; echo "I'm now in $PWD") -pwd # still in first directory +pwd # 仍然在第一个目录 ``` ### 检查命令 ```bash command -V cd -#=> "cd is a function/alias/whatever" +#=> "cd 是一个函数/别名/其他" ``` ### 重定向