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 是一个函数/别名/其他"
```
### 重定向