ccgx-workflow 1.0.0 → 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +37 -5
- package/README.zh-CN.md +35 -5
- package/dist/cli.mjs +1 -1
- package/dist/index.mjs +2 -2
- package/dist/shared/{ccgx-workflow.WgUzkiC3.mjs → ccgx-workflow.SJPbUy5_.mjs} +17 -110
- package/package.json +2 -1
- package/templates/commands/agents/phase-runner.md +321 -321
- package/templates/commands/autonomous.md +792 -792
- package/templates/commands/cancel.md +132 -132
- package/templates/commands/debug.md +226 -226
- package/templates/commands/status.md +206 -206
- package/templates/commands/team.md +484 -0
- package/templates/hooks/ccg-session-state.cjs +510 -510
- package/templates/scripts/ccg-phase-runner-launcher.mjs +467 -467
- package/templates/scripts/invoke-model.mjs +64 -0
- package/templates/skills/domains/ai/SKILL.md +35 -35
- package/templates/skills/domains/ai/agent-dev.md +242 -242
- package/templates/skills/domains/ai/llm-security.md +288 -288
- package/templates/skills/domains/ai/rag-system.md +542 -542
- package/templates/skills/domains/architecture/SKILL.md +43 -43
- package/templates/skills/domains/architecture/api-design.md +225 -225
- package/templates/skills/domains/architecture/cloud-native.md +285 -285
- package/templates/skills/domains/architecture/security-arch.md +297 -297
- package/templates/skills/domains/data-engineering/SKILL.md +208 -208
- package/templates/skills/domains/development/SKILL.md +47 -47
- package/templates/skills/domains/development/cpp.md +246 -246
- package/templates/skills/domains/development/go.md +323 -323
- package/templates/skills/domains/development/java.md +277 -277
- package/templates/skills/domains/development/python.md +288 -288
- package/templates/skills/domains/development/rust.md +313 -313
- package/templates/skills/domains/development/shell.md +313 -313
- package/templates/skills/domains/development/typescript.md +277 -277
- package/templates/skills/domains/devops/SKILL.md +40 -40
- package/templates/skills/domains/devops/database.md +217 -217
- package/templates/skills/domains/devops/devsecops.md +198 -198
- package/templates/skills/domains/devops/git-workflow.md +181 -181
- package/templates/skills/domains/devops/testing.md +283 -283
- package/templates/skills/domains/frontend-design/SKILL.md +244 -244
- package/templates/skills/domains/frontend-design/claymorphism/SKILL.md +121 -121
- package/templates/skills/domains/frontend-design/component-patterns.md +202 -202
- package/templates/skills/domains/frontend-design/glassmorphism/SKILL.md +142 -142
- package/templates/skills/domains/frontend-design/liquid-glass/SKILL.md +139 -139
- package/templates/skills/domains/frontend-design/neubrutalism/SKILL.md +145 -145
- package/templates/skills/domains/frontend-design/state-management.md +680 -680
- package/templates/skills/domains/frontend-design/ui-aesthetics.md +110 -110
- package/templates/skills/domains/frontend-design/ux-principles.md +156 -156
- package/templates/skills/domains/infrastructure/SKILL.md +201 -201
- package/templates/skills/domains/mobile/SKILL.md +225 -225
- package/templates/skills/domains/orchestration/SKILL.md +30 -30
- package/templates/skills/domains/orchestration/multi-agent.md +228 -228
- package/templates/skills/domains/security/SKILL.md +73 -73
- package/templates/skills/domains/security/blue-team.md +436 -436
- package/templates/skills/domains/security/code-audit.md +265 -265
- package/templates/skills/domains/security/pentest.md +226 -226
- package/templates/skills/domains/security/red-team.md +374 -374
- package/templates/skills/domains/security/threat-intel.md +372 -372
- package/templates/skills/domains/security/vuln-research.md +369 -369
- package/templates/skills/tools/lib/shared.js +98 -98
- package/templates/skills/tools/override-refusal/SKILL.md +53 -53
- package/templates/skills/tools/override-refusal/scripts/refusal_rewriter.js +226 -226
|
@@ -1,313 +1,313 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: shell
|
|
3
|
-
description: Shell 脚本开发。Bash、自动化、系统管理。当用户提到 Shell、Bash、脚本、自动化、Linux命令时使用。
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# 📜 符箓秘典 · Shell
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
## Bash 基础
|
|
10
|
-
|
|
11
|
-
### 变量与字符串
|
|
12
|
-
```bash
|
|
13
|
-
#!/bin/bash
|
|
14
|
-
|
|
15
|
-
# 变量
|
|
16
|
-
name="Alice"
|
|
17
|
-
age=25
|
|
18
|
-
readonly PI=3.14
|
|
19
|
-
|
|
20
|
-
# 字符串操作
|
|
21
|
-
str="Hello World"
|
|
22
|
-
echo ${#str} # 长度: 11
|
|
23
|
-
echo ${str:0:5} # 截取: Hello
|
|
24
|
-
echo ${str/World/Bash} # 替换: Hello Bash
|
|
25
|
-
echo ${str,,} # 小写: hello world
|
|
26
|
-
echo ${str^^} # 大写: HELLO WORLD
|
|
27
|
-
|
|
28
|
-
# 默认值
|
|
29
|
-
echo ${var:-default} # 如果 var 未设置,返回 default
|
|
30
|
-
echo ${var:=default} # 如果 var 未设置,设置并返回 default
|
|
31
|
-
```
|
|
32
|
-
|
|
33
|
-
### 数组
|
|
34
|
-
```bash
|
|
35
|
-
# 索引数组
|
|
36
|
-
arr=("a" "b" "c")
|
|
37
|
-
echo ${arr[0]} # 第一个元素
|
|
38
|
-
echo ${arr[@]} # 所有元素
|
|
39
|
-
echo ${#arr[@]} # 数组长度
|
|
40
|
-
|
|
41
|
-
# 遍历
|
|
42
|
-
for item in "${arr[@]}"; do
|
|
43
|
-
echo "$item"
|
|
44
|
-
done
|
|
45
|
-
|
|
46
|
-
# 关联数组 (Bash 4+)
|
|
47
|
-
declare -A map
|
|
48
|
-
map[name]="Alice"
|
|
49
|
-
map[age]=25
|
|
50
|
-
echo ${map[name]}
|
|
51
|
-
```
|
|
52
|
-
|
|
53
|
-
### 条件判断
|
|
54
|
-
```bash
|
|
55
|
-
# 字符串比较
|
|
56
|
-
if [[ "$str1" == "$str2" ]]; then
|
|
57
|
-
echo "Equal"
|
|
58
|
-
fi
|
|
59
|
-
|
|
60
|
-
# 数值比较
|
|
61
|
-
if [[ $a -eq $b ]]; then echo "Equal"; fi
|
|
62
|
-
if [[ $a -lt $b ]]; then echo "Less"; fi
|
|
63
|
-
if [[ $a -gt $b ]]; then echo "Greater"; fi
|
|
64
|
-
|
|
65
|
-
# 文件测试
|
|
66
|
-
if [[ -f "$file" ]]; then echo "File exists"; fi
|
|
67
|
-
if [[ -d "$dir" ]]; then echo "Directory exists"; fi
|
|
68
|
-
if [[ -r "$file" ]]; then echo "Readable"; fi
|
|
69
|
-
if [[ -w "$file" ]]; then echo "Writable"; fi
|
|
70
|
-
if [[ -x "$file" ]]; then echo "Executable"; fi
|
|
71
|
-
|
|
72
|
-
# 逻辑运算
|
|
73
|
-
if [[ $a -gt 0 && $b -gt 0 ]]; then echo "Both positive"; fi
|
|
74
|
-
if [[ $a -gt 0 || $b -gt 0 ]]; then echo "At least one positive"; fi
|
|
75
|
-
```
|
|
76
|
-
|
|
77
|
-
### 循环
|
|
78
|
-
```bash
|
|
79
|
-
# for 循环
|
|
80
|
-
for i in {1..5}; do
|
|
81
|
-
echo $i
|
|
82
|
-
done
|
|
83
|
-
|
|
84
|
-
for file in *.txt; do
|
|
85
|
-
echo "Processing $file"
|
|
86
|
-
done
|
|
87
|
-
|
|
88
|
-
# while 循环
|
|
89
|
-
while read -r line; do
|
|
90
|
-
echo "$line"
|
|
91
|
-
done < file.txt
|
|
92
|
-
|
|
93
|
-
# until 循环
|
|
94
|
-
count=0
|
|
95
|
-
until [[ $count -ge 5 ]]; do
|
|
96
|
-
echo $count
|
|
97
|
-
((count++))
|
|
98
|
-
done
|
|
99
|
-
```
|
|
100
|
-
|
|
101
|
-
### 函数
|
|
102
|
-
```bash
|
|
103
|
-
# 定义函数
|
|
104
|
-
greet() {
|
|
105
|
-
local name="$1"
|
|
106
|
-
echo "Hello, $name!"
|
|
107
|
-
return 0
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
# 调用
|
|
111
|
-
greet "Alice"
|
|
112
|
-
result=$? # 获取返回值
|
|
113
|
-
|
|
114
|
-
# 返回字符串
|
|
115
|
-
get_date() {
|
|
116
|
-
echo "$(date +%Y-%m-%d)"
|
|
117
|
-
}
|
|
118
|
-
today=$(get_date)
|
|
119
|
-
```
|
|
120
|
-
|
|
121
|
-
## 实用脚本模板
|
|
122
|
-
|
|
123
|
-
### 带参数的脚本
|
|
124
|
-
```bash
|
|
125
|
-
#!/bin/bash
|
|
126
|
-
set -euo pipefail
|
|
127
|
-
|
|
128
|
-
usage() {
|
|
129
|
-
cat <<EOF
|
|
130
|
-
Usage: $(basename "$0") [OPTIONS] <input>
|
|
131
|
-
|
|
132
|
-
Options:
|
|
133
|
-
-o, --output FILE Output file
|
|
134
|
-
-v, --verbose Verbose mode
|
|
135
|
-
-h, --help Show this help
|
|
136
|
-
EOF
|
|
137
|
-
exit 1
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
# 默认值
|
|
141
|
-
OUTPUT=""
|
|
142
|
-
VERBOSE=false
|
|
143
|
-
|
|
144
|
-
# 解析参数
|
|
145
|
-
while [[ $# -gt 0 ]]; do
|
|
146
|
-
case "$1" in
|
|
147
|
-
-o|--output)
|
|
148
|
-
OUTPUT="$2"
|
|
149
|
-
shift 2
|
|
150
|
-
;;
|
|
151
|
-
-v|--verbose)
|
|
152
|
-
VERBOSE=true
|
|
153
|
-
shift
|
|
154
|
-
;;
|
|
155
|
-
-h|--help)
|
|
156
|
-
usage
|
|
157
|
-
;;
|
|
158
|
-
-*)
|
|
159
|
-
echo "Unknown option: $1"
|
|
160
|
-
usage
|
|
161
|
-
;;
|
|
162
|
-
*)
|
|
163
|
-
INPUT="$1"
|
|
164
|
-
shift
|
|
165
|
-
;;
|
|
166
|
-
esac
|
|
167
|
-
done
|
|
168
|
-
|
|
169
|
-
# 检查必需参数
|
|
170
|
-
if [[ -z "${INPUT:-}" ]]; then
|
|
171
|
-
echo "Error: Input is required"
|
|
172
|
-
usage
|
|
173
|
-
fi
|
|
174
|
-
|
|
175
|
-
# 主逻辑
|
|
176
|
-
main() {
|
|
177
|
-
if $VERBOSE; then
|
|
178
|
-
echo "Processing $INPUT..."
|
|
179
|
-
fi
|
|
180
|
-
# 处理逻辑
|
|
181
|
-
}
|
|
182
|
-
|
|
183
|
-
main
|
|
184
|
-
```
|
|
185
|
-
|
|
186
|
-
### 日志函数
|
|
187
|
-
```bash
|
|
188
|
-
#!/bin/bash
|
|
189
|
-
|
|
190
|
-
# 颜色定义
|
|
191
|
-
RED='\033[0;31m'
|
|
192
|
-
GREEN='\033[0;32m'
|
|
193
|
-
YELLOW='\033[1;33m'
|
|
194
|
-
NC='\033[0m'
|
|
195
|
-
|
|
196
|
-
log_info() {
|
|
197
|
-
echo -e "${GREEN}[INFO]${NC} $1"
|
|
198
|
-
}
|
|
199
|
-
|
|
200
|
-
log_warn() {
|
|
201
|
-
echo -e "${YELLOW}[WARN]${NC} $1"
|
|
202
|
-
}
|
|
203
|
-
|
|
204
|
-
log_error() {
|
|
205
|
-
echo -e "${RED}[ERROR]${NC} $1" >&2
|
|
206
|
-
}
|
|
207
|
-
|
|
208
|
-
die() {
|
|
209
|
-
log_error "$1"
|
|
210
|
-
exit 1
|
|
211
|
-
}
|
|
212
|
-
```
|
|
213
|
-
|
|
214
|
-
### 错误处理
|
|
215
|
-
```bash
|
|
216
|
-
#!/bin/bash
|
|
217
|
-
set -euo pipefail
|
|
218
|
-
|
|
219
|
-
# 错误处理
|
|
220
|
-
trap 'echo "Error on line $LINENO"; exit 1' ERR
|
|
221
|
-
|
|
222
|
-
# 清理函数
|
|
223
|
-
cleanup() {
|
|
224
|
-
rm -f "$TEMP_FILE"
|
|
225
|
-
}
|
|
226
|
-
trap cleanup EXIT
|
|
227
|
-
|
|
228
|
-
TEMP_FILE=$(mktemp)
|
|
229
|
-
```
|
|
230
|
-
|
|
231
|
-
## 常用命令组合
|
|
232
|
-
|
|
233
|
-
### 文本处理
|
|
234
|
-
```bash
|
|
235
|
-
# grep - 搜索
|
|
236
|
-
grep -r "pattern" .
|
|
237
|
-
grep -v "exclude" # 排除
|
|
238
|
-
grep -i "case insensitive" # 忽略大小写
|
|
239
|
-
grep -E "regex" # 正则
|
|
240
|
-
|
|
241
|
-
# sed - 替换
|
|
242
|
-
sed 's/old/new/g' file
|
|
243
|
-
sed -i 's/old/new/g' file # 原地修改
|
|
244
|
-
sed -n '10,20p' file # 打印行
|
|
245
|
-
|
|
246
|
-
# awk - 处理
|
|
247
|
-
awk '{print $1}' file # 第一列
|
|
248
|
-
awk -F: '{print $1}' /etc/passwd
|
|
249
|
-
awk 'NR>1 {sum+=$1} END {print sum}' file
|
|
250
|
-
|
|
251
|
-
# 组合
|
|
252
|
-
cat file | grep "pattern" | awk '{print $2}' | sort | uniq -c
|
|
253
|
-
```
|
|
254
|
-
|
|
255
|
-
### 文件操作
|
|
256
|
-
```bash
|
|
257
|
-
# 查找
|
|
258
|
-
find . -name "*.txt"
|
|
259
|
-
find . -type f -mtime -7 # 7天内修改
|
|
260
|
-
find . -size +100M # 大于100M
|
|
261
|
-
find . -name "*.log" -exec rm {} \;
|
|
262
|
-
|
|
263
|
-
# 批量重命名
|
|
264
|
-
for f in *.txt; do
|
|
265
|
-
mv "$f" "${f%.txt}.md"
|
|
266
|
-
done
|
|
267
|
-
|
|
268
|
-
# 批量处理
|
|
269
|
-
find . -name "*.py" | xargs grep "TODO"
|
|
270
|
-
```
|
|
271
|
-
|
|
272
|
-
### 网络
|
|
273
|
-
```bash
|
|
274
|
-
# curl
|
|
275
|
-
curl -s https://api.example.com/data
|
|
276
|
-
curl -X POST -H "Content-Type: application/json" -d '{"key":"value"}' URL
|
|
277
|
-
curl -o output.file URL
|
|
278
|
-
|
|
279
|
-
# 端口检查
|
|
280
|
-
nc -zv host 80
|
|
281
|
-
ss -tulpn | grep :80
|
|
282
|
-
```
|
|
283
|
-
|
|
284
|
-
## 最佳实践
|
|
285
|
-
|
|
286
|
-
```bash
|
|
287
|
-
#!/bin/bash
|
|
288
|
-
# 1. 使用 set 选项
|
|
289
|
-
set -euo pipefail
|
|
290
|
-
|
|
291
|
-
# 2. 引用变量
|
|
292
|
-
echo "$variable"
|
|
293
|
-
|
|
294
|
-
# 3. 使用 [[ ]] 而非 [ ]
|
|
295
|
-
if [[ -f "$file" ]]; then
|
|
296
|
-
|
|
297
|
-
# 4. 使用 $() 而非反引号
|
|
298
|
-
result=$(command)
|
|
299
|
-
|
|
300
|
-
# 5. 使用 local 声明局部变量
|
|
301
|
-
func() {
|
|
302
|
-
local var="value"
|
|
303
|
-
}
|
|
304
|
-
|
|
305
|
-
# 6. 检查命令是否存在
|
|
306
|
-
command -v git &>/dev/null || die "git not found"
|
|
307
|
-
|
|
308
|
-
# 7. 使用 shellcheck 检查
|
|
309
|
-
# shellcheck script.sh
|
|
310
|
-
```
|
|
311
|
-
|
|
312
|
-
---
|
|
313
|
-
|
|
1
|
+
---
|
|
2
|
+
name: shell
|
|
3
|
+
description: Shell 脚本开发。Bash、自动化、系统管理。当用户提到 Shell、Bash、脚本、自动化、Linux命令时使用。
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# 📜 符箓秘典 · Shell
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
## Bash 基础
|
|
10
|
+
|
|
11
|
+
### 变量与字符串
|
|
12
|
+
```bash
|
|
13
|
+
#!/bin/bash
|
|
14
|
+
|
|
15
|
+
# 变量
|
|
16
|
+
name="Alice"
|
|
17
|
+
age=25
|
|
18
|
+
readonly PI=3.14
|
|
19
|
+
|
|
20
|
+
# 字符串操作
|
|
21
|
+
str="Hello World"
|
|
22
|
+
echo ${#str} # 长度: 11
|
|
23
|
+
echo ${str:0:5} # 截取: Hello
|
|
24
|
+
echo ${str/World/Bash} # 替换: Hello Bash
|
|
25
|
+
echo ${str,,} # 小写: hello world
|
|
26
|
+
echo ${str^^} # 大写: HELLO WORLD
|
|
27
|
+
|
|
28
|
+
# 默认值
|
|
29
|
+
echo ${var:-default} # 如果 var 未设置,返回 default
|
|
30
|
+
echo ${var:=default} # 如果 var 未设置,设置并返回 default
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
### 数组
|
|
34
|
+
```bash
|
|
35
|
+
# 索引数组
|
|
36
|
+
arr=("a" "b" "c")
|
|
37
|
+
echo ${arr[0]} # 第一个元素
|
|
38
|
+
echo ${arr[@]} # 所有元素
|
|
39
|
+
echo ${#arr[@]} # 数组长度
|
|
40
|
+
|
|
41
|
+
# 遍历
|
|
42
|
+
for item in "${arr[@]}"; do
|
|
43
|
+
echo "$item"
|
|
44
|
+
done
|
|
45
|
+
|
|
46
|
+
# 关联数组 (Bash 4+)
|
|
47
|
+
declare -A map
|
|
48
|
+
map[name]="Alice"
|
|
49
|
+
map[age]=25
|
|
50
|
+
echo ${map[name]}
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
### 条件判断
|
|
54
|
+
```bash
|
|
55
|
+
# 字符串比较
|
|
56
|
+
if [[ "$str1" == "$str2" ]]; then
|
|
57
|
+
echo "Equal"
|
|
58
|
+
fi
|
|
59
|
+
|
|
60
|
+
# 数值比较
|
|
61
|
+
if [[ $a -eq $b ]]; then echo "Equal"; fi
|
|
62
|
+
if [[ $a -lt $b ]]; then echo "Less"; fi
|
|
63
|
+
if [[ $a -gt $b ]]; then echo "Greater"; fi
|
|
64
|
+
|
|
65
|
+
# 文件测试
|
|
66
|
+
if [[ -f "$file" ]]; then echo "File exists"; fi
|
|
67
|
+
if [[ -d "$dir" ]]; then echo "Directory exists"; fi
|
|
68
|
+
if [[ -r "$file" ]]; then echo "Readable"; fi
|
|
69
|
+
if [[ -w "$file" ]]; then echo "Writable"; fi
|
|
70
|
+
if [[ -x "$file" ]]; then echo "Executable"; fi
|
|
71
|
+
|
|
72
|
+
# 逻辑运算
|
|
73
|
+
if [[ $a -gt 0 && $b -gt 0 ]]; then echo "Both positive"; fi
|
|
74
|
+
if [[ $a -gt 0 || $b -gt 0 ]]; then echo "At least one positive"; fi
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
### 循环
|
|
78
|
+
```bash
|
|
79
|
+
# for 循环
|
|
80
|
+
for i in {1..5}; do
|
|
81
|
+
echo $i
|
|
82
|
+
done
|
|
83
|
+
|
|
84
|
+
for file in *.txt; do
|
|
85
|
+
echo "Processing $file"
|
|
86
|
+
done
|
|
87
|
+
|
|
88
|
+
# while 循环
|
|
89
|
+
while read -r line; do
|
|
90
|
+
echo "$line"
|
|
91
|
+
done < file.txt
|
|
92
|
+
|
|
93
|
+
# until 循环
|
|
94
|
+
count=0
|
|
95
|
+
until [[ $count -ge 5 ]]; do
|
|
96
|
+
echo $count
|
|
97
|
+
((count++))
|
|
98
|
+
done
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
### 函数
|
|
102
|
+
```bash
|
|
103
|
+
# 定义函数
|
|
104
|
+
greet() {
|
|
105
|
+
local name="$1"
|
|
106
|
+
echo "Hello, $name!"
|
|
107
|
+
return 0
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
# 调用
|
|
111
|
+
greet "Alice"
|
|
112
|
+
result=$? # 获取返回值
|
|
113
|
+
|
|
114
|
+
# 返回字符串
|
|
115
|
+
get_date() {
|
|
116
|
+
echo "$(date +%Y-%m-%d)"
|
|
117
|
+
}
|
|
118
|
+
today=$(get_date)
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
## 实用脚本模板
|
|
122
|
+
|
|
123
|
+
### 带参数的脚本
|
|
124
|
+
```bash
|
|
125
|
+
#!/bin/bash
|
|
126
|
+
set -euo pipefail
|
|
127
|
+
|
|
128
|
+
usage() {
|
|
129
|
+
cat <<EOF
|
|
130
|
+
Usage: $(basename "$0") [OPTIONS] <input>
|
|
131
|
+
|
|
132
|
+
Options:
|
|
133
|
+
-o, --output FILE Output file
|
|
134
|
+
-v, --verbose Verbose mode
|
|
135
|
+
-h, --help Show this help
|
|
136
|
+
EOF
|
|
137
|
+
exit 1
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
# 默认值
|
|
141
|
+
OUTPUT=""
|
|
142
|
+
VERBOSE=false
|
|
143
|
+
|
|
144
|
+
# 解析参数
|
|
145
|
+
while [[ $# -gt 0 ]]; do
|
|
146
|
+
case "$1" in
|
|
147
|
+
-o|--output)
|
|
148
|
+
OUTPUT="$2"
|
|
149
|
+
shift 2
|
|
150
|
+
;;
|
|
151
|
+
-v|--verbose)
|
|
152
|
+
VERBOSE=true
|
|
153
|
+
shift
|
|
154
|
+
;;
|
|
155
|
+
-h|--help)
|
|
156
|
+
usage
|
|
157
|
+
;;
|
|
158
|
+
-*)
|
|
159
|
+
echo "Unknown option: $1"
|
|
160
|
+
usage
|
|
161
|
+
;;
|
|
162
|
+
*)
|
|
163
|
+
INPUT="$1"
|
|
164
|
+
shift
|
|
165
|
+
;;
|
|
166
|
+
esac
|
|
167
|
+
done
|
|
168
|
+
|
|
169
|
+
# 检查必需参数
|
|
170
|
+
if [[ -z "${INPUT:-}" ]]; then
|
|
171
|
+
echo "Error: Input is required"
|
|
172
|
+
usage
|
|
173
|
+
fi
|
|
174
|
+
|
|
175
|
+
# 主逻辑
|
|
176
|
+
main() {
|
|
177
|
+
if $VERBOSE; then
|
|
178
|
+
echo "Processing $INPUT..."
|
|
179
|
+
fi
|
|
180
|
+
# 处理逻辑
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
main
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
### 日志函数
|
|
187
|
+
```bash
|
|
188
|
+
#!/bin/bash
|
|
189
|
+
|
|
190
|
+
# 颜色定义
|
|
191
|
+
RED='\033[0;31m'
|
|
192
|
+
GREEN='\033[0;32m'
|
|
193
|
+
YELLOW='\033[1;33m'
|
|
194
|
+
NC='\033[0m'
|
|
195
|
+
|
|
196
|
+
log_info() {
|
|
197
|
+
echo -e "${GREEN}[INFO]${NC} $1"
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
log_warn() {
|
|
201
|
+
echo -e "${YELLOW}[WARN]${NC} $1"
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
log_error() {
|
|
205
|
+
echo -e "${RED}[ERROR]${NC} $1" >&2
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
die() {
|
|
209
|
+
log_error "$1"
|
|
210
|
+
exit 1
|
|
211
|
+
}
|
|
212
|
+
```
|
|
213
|
+
|
|
214
|
+
### 错误处理
|
|
215
|
+
```bash
|
|
216
|
+
#!/bin/bash
|
|
217
|
+
set -euo pipefail
|
|
218
|
+
|
|
219
|
+
# 错误处理
|
|
220
|
+
trap 'echo "Error on line $LINENO"; exit 1' ERR
|
|
221
|
+
|
|
222
|
+
# 清理函数
|
|
223
|
+
cleanup() {
|
|
224
|
+
rm -f "$TEMP_FILE"
|
|
225
|
+
}
|
|
226
|
+
trap cleanup EXIT
|
|
227
|
+
|
|
228
|
+
TEMP_FILE=$(mktemp)
|
|
229
|
+
```
|
|
230
|
+
|
|
231
|
+
## 常用命令组合
|
|
232
|
+
|
|
233
|
+
### 文本处理
|
|
234
|
+
```bash
|
|
235
|
+
# grep - 搜索
|
|
236
|
+
grep -r "pattern" .
|
|
237
|
+
grep -v "exclude" # 排除
|
|
238
|
+
grep -i "case insensitive" # 忽略大小写
|
|
239
|
+
grep -E "regex" # 正则
|
|
240
|
+
|
|
241
|
+
# sed - 替换
|
|
242
|
+
sed 's/old/new/g' file
|
|
243
|
+
sed -i 's/old/new/g' file # 原地修改
|
|
244
|
+
sed -n '10,20p' file # 打印行
|
|
245
|
+
|
|
246
|
+
# awk - 处理
|
|
247
|
+
awk '{print $1}' file # 第一列
|
|
248
|
+
awk -F: '{print $1}' /etc/passwd
|
|
249
|
+
awk 'NR>1 {sum+=$1} END {print sum}' file
|
|
250
|
+
|
|
251
|
+
# 组合
|
|
252
|
+
cat file | grep "pattern" | awk '{print $2}' | sort | uniq -c
|
|
253
|
+
```
|
|
254
|
+
|
|
255
|
+
### 文件操作
|
|
256
|
+
```bash
|
|
257
|
+
# 查找
|
|
258
|
+
find . -name "*.txt"
|
|
259
|
+
find . -type f -mtime -7 # 7天内修改
|
|
260
|
+
find . -size +100M # 大于100M
|
|
261
|
+
find . -name "*.log" -exec rm {} \;
|
|
262
|
+
|
|
263
|
+
# 批量重命名
|
|
264
|
+
for f in *.txt; do
|
|
265
|
+
mv "$f" "${f%.txt}.md"
|
|
266
|
+
done
|
|
267
|
+
|
|
268
|
+
# 批量处理
|
|
269
|
+
find . -name "*.py" | xargs grep "TODO"
|
|
270
|
+
```
|
|
271
|
+
|
|
272
|
+
### 网络
|
|
273
|
+
```bash
|
|
274
|
+
# curl
|
|
275
|
+
curl -s https://api.example.com/data
|
|
276
|
+
curl -X POST -H "Content-Type: application/json" -d '{"key":"value"}' URL
|
|
277
|
+
curl -o output.file URL
|
|
278
|
+
|
|
279
|
+
# 端口检查
|
|
280
|
+
nc -zv host 80
|
|
281
|
+
ss -tulpn | grep :80
|
|
282
|
+
```
|
|
283
|
+
|
|
284
|
+
## 最佳实践
|
|
285
|
+
|
|
286
|
+
```bash
|
|
287
|
+
#!/bin/bash
|
|
288
|
+
# 1. 使用 set 选项
|
|
289
|
+
set -euo pipefail
|
|
290
|
+
|
|
291
|
+
# 2. 引用变量
|
|
292
|
+
echo "$variable"
|
|
293
|
+
|
|
294
|
+
# 3. 使用 [[ ]] 而非 [ ]
|
|
295
|
+
if [[ -f "$file" ]]; then
|
|
296
|
+
|
|
297
|
+
# 4. 使用 $() 而非反引号
|
|
298
|
+
result=$(command)
|
|
299
|
+
|
|
300
|
+
# 5. 使用 local 声明局部变量
|
|
301
|
+
func() {
|
|
302
|
+
local var="value"
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
# 6. 检查命令是否存在
|
|
306
|
+
command -v git &>/dev/null || die "git not found"
|
|
307
|
+
|
|
308
|
+
# 7. 使用 shellcheck 检查
|
|
309
|
+
# shellcheck script.sh
|
|
310
|
+
```
|
|
311
|
+
|
|
312
|
+
---
|
|
313
|
+
|