@hybridlabor-api/aos 4.7.2 → 4.9.0
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/.agents/agents.md +1 -1
- package/.agents/nodes.json +1 -1
- package/.agents/vendor-manifest.json +23 -1
- package/.claude/agents/godmode-media-eventtech.md +1 -1
- package/.claude/hooks/conventional-commits.mjs +125 -0
- package/.claude/hooks/env-file-protection.mjs +105 -0
- package/.claude/hooks/go-gate.mjs +101 -81
- package/.claude/settings.json +13 -0
- package/.opencode/agents/godmode-media-eventtech.md +1 -1
- package/.opencode/plugins/bdb-aos.js +31 -4
- package/README.de.md +1 -1
- package/README.md +1 -1
- package/README.pt.md +1 -1
- package/THIRD_PARTY_NOTICES.md +88 -0
- package/docs/skills_table.md +1 -1
- package/installer.js +309 -101
- package/package.json +6 -2
- package/packages/aos-cli/README.md +80 -0
- package/packages/aos-cli/bin/aos-cli.mjs +134 -0
- package/packages/aos-cli/core-skills.json +12 -0
- package/packages/aos-cli/extensions/aos.ts +321 -0
- package/packages/aos-cli/package-lock.json +1923 -0
- package/packages/aos-cli/package.json +29 -0
- package/packages/aos-cli/scripts/check-theme.mjs +63 -0
- package/packages/aos-cli/themes/aos.json +97 -0
- package/scripts/build-plugin-manifest.mjs +131 -0
- package/scripts/validate-skills.mjs +81 -6
- package/skills/basic/ao-orchestrator/SKILL.md +116 -0
- package/skills/global_config/agenttrail/SKILL.md +6 -1
- package/skills/global_config/ask-tim/SKILL.md +4 -4
- package/skills/global_config/bash-script-generator/SKILL.md +201 -0
- package/skills/global_config/bash-script-generator/assets/templates/standard-template.sh +96 -0
- package/skills/global_config/bash-script-generator/docs/bash-scripting-guide.md +729 -0
- package/skills/global_config/bash-script-generator/docs/generation-best-practices.md +193 -0
- package/skills/global_config/bash-script-generator/docs/script-patterns.md +566 -0
- package/skills/global_config/bash-script-generator/docs/text-processing-guide.md +437 -0
- package/skills/global_config/bash-script-generator/examples/log-analyzer.sh +92 -0
- package/skills/global_config/bash-script-generator/scripts/generate_script_template.sh +123 -0
- package/skills/global_config/bash-script-generator/scripts/run_ci_checks.sh +172 -0
- package/skills/global_config/bash-script-generator/scripts/test_generator.sh +413 -0
- package/skills/global_config/bash-script-validator/SKILL.md +249 -0
- package/skills/global_config/bash-script-validator/docs/awk-reference.md +449 -0
- package/skills/global_config/bash-script-validator/docs/bash-reference.md +468 -0
- package/skills/global_config/bash-script-validator/docs/common-mistakes.md +623 -0
- package/skills/global_config/bash-script-validator/docs/grep-reference.md +395 -0
- package/skills/global_config/bash-script-validator/docs/regex-reference.md +391 -0
- package/skills/global_config/bash-script-validator/docs/sed-reference.md +454 -0
- package/skills/global_config/bash-script-validator/docs/shell-reference.md +463 -0
- package/skills/global_config/bash-script-validator/docs/shellcheck-reference.md +399 -0
- package/skills/global_config/bash-script-validator/examples/bad-bash.sh +55 -0
- package/skills/global_config/bash-script-validator/examples/bad-shell.sh +54 -0
- package/skills/global_config/bash-script-validator/examples/good-bash.sh +71 -0
- package/skills/global_config/bash-script-validator/examples/good-shell.sh +69 -0
- package/skills/global_config/bash-script-validator/scripts/run_ci_checks.sh +23 -0
- package/skills/global_config/bash-script-validator/scripts/shellcheck_wrapper.sh +174 -0
- package/skills/global_config/bash-script-validator/scripts/test_validate.sh +446 -0
- package/skills/global_config/bash-script-validator/scripts/validate.sh +512 -0
- package/skills/global_config/ci-pipeline/SKILL.md +135 -0
- package/skills/global_config/dispatching-parallel-agents/SKILL.md +170 -0
- package/skills/global_config/dockerfile-generator/SKILL.md +1038 -0
- package/skills/global_config/dockerfile-generator/examples/example.dockerignore +95 -0
- package/skills/global_config/dockerfile-generator/examples/golang-distroless.Dockerfile +34 -0
- package/skills/global_config/dockerfile-generator/examples/java-springboot.Dockerfile +45 -0
- package/skills/global_config/dockerfile-generator/examples/nextjs-production.Dockerfile +49 -0
- package/skills/global_config/dockerfile-generator/examples/nodejs-multistage.Dockerfile +55 -0
- package/skills/global_config/dockerfile-generator/examples/python-fastapi.Dockerfile +48 -0
- package/skills/global_config/dockerfile-generator/references/language_specific_guides.md +510 -0
- package/skills/global_config/dockerfile-generator/references/multistage_builds.md +570 -0
- package/skills/global_config/dockerfile-generator/references/optimization_patterns.md +492 -0
- package/skills/global_config/dockerfile-generator/references/security_best_practices.md +375 -0
- package/skills/global_config/dockerfile-generator/scripts/generate_dockerignore.sh +199 -0
- package/skills/global_config/dockerfile-generator/scripts/generate_golang.sh +172 -0
- package/skills/global_config/dockerfile-generator/scripts/generate_java.sh +185 -0
- package/skills/global_config/dockerfile-generator/scripts/generate_nodejs.sh +279 -0
- package/skills/global_config/dockerfile-generator/scripts/generate_python.sh +218 -0
- package/skills/global_config/dockerfile-generator/scripts/test_generator.sh +210 -0
- package/skills/global_config/dockerfile-validator/SKILL.md +300 -0
- package/skills/global_config/dockerfile-validator/examples/.dockerignore.example +34 -0
- package/skills/global_config/dockerfile-validator/examples/bad-example.Dockerfile +37 -0
- package/skills/global_config/dockerfile-validator/examples/golang-distroless.Dockerfile +50 -0
- package/skills/global_config/dockerfile-validator/examples/good-example.Dockerfile +52 -0
- package/skills/global_config/dockerfile-validator/examples/python-optimized.Dockerfile +53 -0
- package/skills/global_config/dockerfile-validator/examples/security-issues.Dockerfile +42 -0
- package/skills/global_config/dockerfile-validator/references/docker_best_practices.md +348 -0
- package/skills/global_config/dockerfile-validator/references/optimization_guide.md +473 -0
- package/skills/global_config/dockerfile-validator/references/security_checklist.md +208 -0
- package/skills/global_config/dockerfile-validator/scripts/dockerfile-validate.sh +699 -0
- package/skills/global_config/dockerfile-validator/scripts/test_validate.sh +35 -0
- package/skills/global_config/dockerfile-validator/tests/fixtures/copy-before-yarn-lock-read.Dockerfile +6 -0
- package/skills/global_config/dockerfile-validator/tests/fixtures/copy-before-yarn.Dockerfile +6 -0
- package/skills/global_config/dockerfile-validator/tests/fixtures/from-platform-nonroot.Dockerfile +7 -0
- package/skills/global_config/dockerfile-validator/tests/test_regression.sh +164 -0
- package/skills/global_config/finishing-a-development-branch/SKILL.md +228 -0
- package/skills/global_config/github-actions-generator/SKILL.md +353 -0
- package/skills/global_config/github-actions-generator/assets/templates/action/composite/action.yml +82 -0
- package/skills/global_config/github-actions-generator/assets/templates/action/docker/Dockerfile +25 -0
- package/skills/global_config/github-actions-generator/assets/templates/action/docker/action.yml +42 -0
- package/skills/global_config/github-actions-generator/assets/templates/action/docker/entrypoint.sh +27 -0
- package/skills/global_config/github-actions-generator/assets/templates/action/javascript/action.yml +33 -0
- package/skills/global_config/github-actions-generator/assets/templates/action/javascript/index.js +50 -0
- package/skills/global_config/github-actions-generator/assets/templates/action/javascript/package.json +27 -0
- package/skills/global_config/github-actions-generator/assets/templates/workflow/basic_workflow.yml +242 -0
- package/skills/global_config/github-actions-generator/assets/templates/workflow/reusable_workflow.yml +106 -0
- package/skills/global_config/github-actions-generator/examples/README.md +147 -0
- package/skills/global_config/github-actions-generator/examples/actions/setup-node-cached/action.yml +93 -0
- package/skills/global_config/github-actions-generator/examples/caching/docker-buildkit.yml +256 -0
- package/skills/global_config/github-actions-generator/examples/security/dependency-review.yml +62 -0
- package/skills/global_config/github-actions-generator/examples/security/sbom-attestation.yml +119 -0
- package/skills/global_config/github-actions-generator/examples/triggers/chatops-commands.yml +475 -0
- package/skills/global_config/github-actions-generator/examples/triggers/repository-dispatch.yml +418 -0
- package/skills/global_config/github-actions-generator/examples/triggers/workflow-orchestration.yml +404 -0
- package/skills/global_config/github-actions-generator/examples/workflows/docker-build-push.yml +68 -0
- package/skills/global_config/github-actions-generator/examples/workflows/go-ci.yml +161 -0
- package/skills/global_config/github-actions-generator/examples/workflows/monorepo-ci.yml +340 -0
- package/skills/global_config/github-actions-generator/examples/workflows/multi-environment-deploy.yml +406 -0
- package/skills/global_config/github-actions-generator/examples/workflows/nodejs-ci.yml +122 -0
- package/skills/global_config/github-actions-generator/examples/workflows/python-ci.yml +157 -0
- package/skills/global_config/github-actions-generator/examples/workflows/scheduled-tasks.yml +376 -0
- package/skills/global_config/github-actions-generator/references/advanced-triggers.md +917 -0
- package/skills/global_config/github-actions-generator/references/best-practices.md +755 -0
- package/skills/global_config/github-actions-generator/references/common-actions.md +715 -0
- package/skills/global_config/github-actions-generator/references/custom-actions.md +320 -0
- package/skills/global_config/github-actions-generator/references/expressions-and-contexts.md +688 -0
- package/skills/global_config/github-actions-generator/references/modern-features.md +421 -0
- package/skills/global_config/github-actions-generator/scripts/test_generator.sh +344 -0
- package/skills/global_config/github-actions-templates/SKILL.md +7 -0
- package/skills/global_config/github-actions-validator/SKILL.md +576 -0
- package/skills/global_config/github-actions-validator/examples/README.md +88 -0
- package/skills/global_config/github-actions-validator/examples/outdated-versions.yml +76 -0
- package/skills/global_config/github-actions-validator/examples/valid-ci.yml +79 -0
- package/skills/global_config/github-actions-validator/examples/with-errors.yml +47 -0
- package/skills/global_config/github-actions-validator/references/act_usage.md +233 -0
- package/skills/global_config/github-actions-validator/references/action_versions.md +122 -0
- package/skills/global_config/github-actions-validator/references/actionlint_usage.md +343 -0
- package/skills/global_config/github-actions-validator/references/common_errors.md +512 -0
- package/skills/global_config/github-actions-validator/references/modern_features.md +384 -0
- package/skills/global_config/github-actions-validator/references/runners.md +317 -0
- package/skills/global_config/github-actions-validator/scripts/install_tools.sh +113 -0
- package/skills/global_config/github-actions-validator/scripts/validate_workflow.sh +910 -0
- package/skills/global_config/github-actions-validator/tests/test_validate_workflow.sh +237 -0
- package/skills/global_config/makefile-generator/SKILL.md +614 -0
- package/skills/global_config/makefile-generator/assets/templates/.gitkeep +1 -0
- package/skills/global_config/makefile-generator/docs/makefile-structure.md +530 -0
- package/skills/global_config/makefile-generator/docs/optimization-guide.md +784 -0
- package/skills/global_config/makefile-generator/docs/patterns-guide.md +642 -0
- package/skills/global_config/makefile-generator/docs/security-guide.md +361 -0
- package/skills/global_config/makefile-generator/docs/targets-guide.md +642 -0
- package/skills/global_config/makefile-generator/docs/variables-guide.md +596 -0
- package/skills/global_config/makefile-generator/scripts/add_standard_targets.sh +539 -0
- package/skills/global_config/makefile-generator/scripts/generate_makefile_template.sh +690 -0
- package/skills/global_config/makefile-generator/test/test_helper_scripts.sh +190 -0
- package/skills/global_config/makefile-validator/SKILL.md +244 -0
- package/skills/global_config/makefile-validator/docs/bake-tool.md +1000 -0
- package/skills/global_config/makefile-validator/docs/best-practices.md +858 -0
- package/skills/global_config/makefile-validator/docs/common-mistakes.md +944 -0
- package/skills/global_config/makefile-validator/examples/bad-makefile.mk +77 -0
- package/skills/global_config/makefile-validator/examples/good-makefile.mk +103 -0
- package/skills/global_config/makefile-validator/scripts/test_validate.sh +382 -0
- package/skills/global_config/makefile-validator/scripts/validate_makefile.sh +712 -0
- package/skills/global_config/{MCP_Manage → mcp-manage}/SKILL.md +3 -3
- package/skills/global_config/requesting-code-review/SKILL.md +98 -0
- package/skills/global_config/requesting-code-review/code-reviewer.md +198 -0
- package/skills/global_config/using-git-worktrees/SKILL.md +170 -0
- package/skills/global_config/verification-before-completion/SKILL.md +123 -0
- package/skills/global_config/writing-plans/SKILL.md +126 -46
- package/skills/global_config/writing-plans-legacy/SKILL.md +139 -0
|
@@ -0,0 +1,468 @@
|
|
|
1
|
+
# Bash Reference Guide
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
Bash (Bourne Again SHell) is a Unix shell and command language. This guide covers bash-specific features, syntax, and best practices.
|
|
6
|
+
|
|
7
|
+
**Official Documentation:** https://www.gnu.org/software/bash/manual/
|
|
8
|
+
|
|
9
|
+
## Bash vs POSIX Shell (sh)
|
|
10
|
+
|
|
11
|
+
Bash is a **superset** of POSIX sh with many extensions. Not all bash scripts are POSIX-compliant.
|
|
12
|
+
|
|
13
|
+
### Bash-Specific Features (NOT in POSIX sh)
|
|
14
|
+
|
|
15
|
+
1. **Arrays**
|
|
16
|
+
```bash
|
|
17
|
+
# Bash only
|
|
18
|
+
array=(one two three)
|
|
19
|
+
echo "${array[0]}"
|
|
20
|
+
declare -a indexed_array
|
|
21
|
+
declare -A associative_array
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
2. **[[ ]] Test Construct**
|
|
25
|
+
```bash
|
|
26
|
+
# Bash only - more powerful than [ ]
|
|
27
|
+
if [[ "$var" == pattern* ]]; then
|
|
28
|
+
echo "Matches pattern"
|
|
29
|
+
fi
|
|
30
|
+
|
|
31
|
+
# POSIX sh - use [ ]
|
|
32
|
+
if [ "$var" = "exact" ]; then
|
|
33
|
+
echo "Exact match"
|
|
34
|
+
fi
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
3. **Process Substitution**
|
|
38
|
+
```bash
|
|
39
|
+
# Bash only
|
|
40
|
+
diff <(ls dir1) <(ls dir2)
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
4. **Brace Expansion**
|
|
44
|
+
```bash
|
|
45
|
+
# Bash only
|
|
46
|
+
echo {1..10} # Outputs: 1 2 3 4 5 6 7 8 9 10
|
|
47
|
+
mv file.{txt,bak} # Renames file.txt to file.bak
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
5. **Function Keyword**
|
|
51
|
+
```bash
|
|
52
|
+
# Bash style (function keyword optional)
|
|
53
|
+
function myfunction {
|
|
54
|
+
echo "Hello"
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
# POSIX sh style (no function keyword)
|
|
58
|
+
myfunction() {
|
|
59
|
+
echo "Hello"
|
|
60
|
+
}
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
6. **Local Variables**
|
|
64
|
+
```bash
|
|
65
|
+
# Bash only
|
|
66
|
+
function myfunc {
|
|
67
|
+
local var="value"
|
|
68
|
+
echo "$var"
|
|
69
|
+
}
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
7. **Extended Pattern Matching**
|
|
73
|
+
```bash
|
|
74
|
+
shopt -s extglob
|
|
75
|
+
# Bash only
|
|
76
|
+
?(pattern-list) # Matches zero or one occurrence
|
|
77
|
+
*(pattern-list) # Matches zero or more occurrences
|
|
78
|
+
+(pattern-list) # Matches one or more occurrences
|
|
79
|
+
@(pattern-list) # Matches one occurrence
|
|
80
|
+
!(pattern-list) # Matches anything except pattern
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
8. **Advanced Parameter Expansion**
|
|
84
|
+
```bash
|
|
85
|
+
# Bash supports more advanced parameter expansion
|
|
86
|
+
${var,,} # Lowercase
|
|
87
|
+
${var^^} # Uppercase
|
|
88
|
+
${var:0:5} # Substring
|
|
89
|
+
${var/pattern/replacement} # Replace first
|
|
90
|
+
${var//pattern/replacement} # Replace all
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
9. **Source vs Dot**
|
|
94
|
+
```bash
|
|
95
|
+
source script.sh # Bash (also works: . script.sh)
|
|
96
|
+
. script.sh # POSIX sh
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
10. **Bash Built-in Variables**
|
|
100
|
+
```bash
|
|
101
|
+
$RANDOM # Random number
|
|
102
|
+
$SECONDS # Seconds since script started
|
|
103
|
+
$BASH_VERSION
|
|
104
|
+
$BASH_SOURCE
|
|
105
|
+
$FUNCNAME
|
|
106
|
+
$DIRSTACK
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
## Core Bash Syntax
|
|
110
|
+
|
|
111
|
+
### Variables
|
|
112
|
+
|
|
113
|
+
```bash
|
|
114
|
+
# Assignment (no spaces around =)
|
|
115
|
+
var="value"
|
|
116
|
+
readonly CONST="constant"
|
|
117
|
+
declare -i integer=42
|
|
118
|
+
declare -r readonly_var="const"
|
|
119
|
+
declare -x export_var="exported"
|
|
120
|
+
|
|
121
|
+
# Reading variables
|
|
122
|
+
echo "$var"
|
|
123
|
+
echo "${var}" # Preferred for clarity
|
|
124
|
+
|
|
125
|
+
# Command substitution
|
|
126
|
+
result=$(command)
|
|
127
|
+
result=`command` # Deprecated, use $() instead
|
|
128
|
+
|
|
129
|
+
# Arithmetic
|
|
130
|
+
result=$((5 + 3))
|
|
131
|
+
((var++))
|
|
132
|
+
((var += 5))
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
### Quoting Rules
|
|
136
|
+
|
|
137
|
+
```bash
|
|
138
|
+
# Double quotes: Preserve literal value except $, `, \, and !
|
|
139
|
+
echo "Value: $var"
|
|
140
|
+
|
|
141
|
+
# Single quotes: Preserve literal value of all characters
|
|
142
|
+
echo 'Value: $var' # Outputs: Value: $var
|
|
143
|
+
|
|
144
|
+
# No quotes: Word splitting and pathname expansion
|
|
145
|
+
files=$var # Dangerous if var contains spaces
|
|
146
|
+
|
|
147
|
+
# Always quote variable expansions unless you need word splitting
|
|
148
|
+
cp "$file" "$destination"
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
### Control Structures
|
|
152
|
+
|
|
153
|
+
```bash
|
|
154
|
+
# If statement
|
|
155
|
+
if [[ condition ]]; then
|
|
156
|
+
# commands
|
|
157
|
+
elif [[ condition ]]; then
|
|
158
|
+
# commands
|
|
159
|
+
else
|
|
160
|
+
# commands
|
|
161
|
+
fi
|
|
162
|
+
|
|
163
|
+
# Case statement
|
|
164
|
+
case "$var" in
|
|
165
|
+
pattern1)
|
|
166
|
+
# commands
|
|
167
|
+
;;
|
|
168
|
+
pattern2|pattern3)
|
|
169
|
+
# commands
|
|
170
|
+
;;
|
|
171
|
+
*)
|
|
172
|
+
# default
|
|
173
|
+
;;
|
|
174
|
+
esac
|
|
175
|
+
|
|
176
|
+
# For loops
|
|
177
|
+
for item in list; do
|
|
178
|
+
echo "$item"
|
|
179
|
+
done
|
|
180
|
+
|
|
181
|
+
for ((i=0; i<10; i++)); do
|
|
182
|
+
echo "$i"
|
|
183
|
+
done
|
|
184
|
+
|
|
185
|
+
# While loop
|
|
186
|
+
while [[ condition ]]; do
|
|
187
|
+
# commands
|
|
188
|
+
done
|
|
189
|
+
|
|
190
|
+
# Until loop
|
|
191
|
+
until [[ condition ]]; do
|
|
192
|
+
# commands
|
|
193
|
+
done
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
### Functions
|
|
197
|
+
|
|
198
|
+
```bash
|
|
199
|
+
# Function definition
|
|
200
|
+
function_name() {
|
|
201
|
+
local local_var="value"
|
|
202
|
+
echo "$1" # First argument
|
|
203
|
+
return 0 # Exit status
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
# Call function
|
|
207
|
+
function_name arg1 arg2
|
|
208
|
+
|
|
209
|
+
# Function with return value (via stdout)
|
|
210
|
+
get_value() {
|
|
211
|
+
echo "returned value"
|
|
212
|
+
}
|
|
213
|
+
result=$(get_value)
|
|
214
|
+
```
|
|
215
|
+
|
|
216
|
+
### Error Handling
|
|
217
|
+
|
|
218
|
+
```bash
|
|
219
|
+
# Exit on error
|
|
220
|
+
set -e
|
|
221
|
+
set -o errexit
|
|
222
|
+
|
|
223
|
+
# Exit on undefined variable
|
|
224
|
+
set -u
|
|
225
|
+
set -o nounset
|
|
226
|
+
|
|
227
|
+
# Pipe failure detection
|
|
228
|
+
set -o pipefail
|
|
229
|
+
|
|
230
|
+
# Combining options
|
|
231
|
+
set -euo pipefail
|
|
232
|
+
|
|
233
|
+
# Trap errors
|
|
234
|
+
trap 'echo "Error on line $LINENO"' ERR
|
|
235
|
+
|
|
236
|
+
# Trap exit
|
|
237
|
+
trap cleanup EXIT
|
|
238
|
+
cleanup() {
|
|
239
|
+
# Cleanup code
|
|
240
|
+
rm -f "$temp_file"
|
|
241
|
+
}
|
|
242
|
+
```
|
|
243
|
+
|
|
244
|
+
### Input/Output Redirection
|
|
245
|
+
|
|
246
|
+
```bash
|
|
247
|
+
# Redirect stdout
|
|
248
|
+
command > file
|
|
249
|
+
|
|
250
|
+
# Redirect stderr
|
|
251
|
+
command 2> errors.txt
|
|
252
|
+
|
|
253
|
+
# Redirect both
|
|
254
|
+
command &> output.txt
|
|
255
|
+
command > output.txt 2>&1
|
|
256
|
+
|
|
257
|
+
# Append
|
|
258
|
+
command >> file
|
|
259
|
+
|
|
260
|
+
# Here document
|
|
261
|
+
cat <<EOF
|
|
262
|
+
multiple
|
|
263
|
+
lines
|
|
264
|
+
of text
|
|
265
|
+
EOF
|
|
266
|
+
|
|
267
|
+
# Here string
|
|
268
|
+
grep pattern <<< "$variable"
|
|
269
|
+
```
|
|
270
|
+
|
|
271
|
+
## Best Practices
|
|
272
|
+
|
|
273
|
+
### 1. Use SheBang
|
|
274
|
+
```bash
|
|
275
|
+
#!/usr/bin/env bash
|
|
276
|
+
# Portable shebang that finds bash in PATH
|
|
277
|
+
```
|
|
278
|
+
|
|
279
|
+
### 2. Enable Strict Mode
|
|
280
|
+
```bash
|
|
281
|
+
#!/usr/bin/env bash
|
|
282
|
+
set -euo pipefail
|
|
283
|
+
IFS=$'\n\t'
|
|
284
|
+
```
|
|
285
|
+
|
|
286
|
+
### 3. Quote Variables
|
|
287
|
+
```bash
|
|
288
|
+
# Good
|
|
289
|
+
cp "$source" "$destination"
|
|
290
|
+
|
|
291
|
+
# Bad (fails with spaces)
|
|
292
|
+
cp $source $destination
|
|
293
|
+
```
|
|
294
|
+
|
|
295
|
+
### 4. Use $() Instead of Backticks
|
|
296
|
+
```bash
|
|
297
|
+
# Good
|
|
298
|
+
result=$(command)
|
|
299
|
+
|
|
300
|
+
# Bad
|
|
301
|
+
result=`command`
|
|
302
|
+
```
|
|
303
|
+
|
|
304
|
+
### 5. Check Command Existence
|
|
305
|
+
```bash
|
|
306
|
+
if command -v shellcheck &>/dev/null; then
|
|
307
|
+
echo "ShellCheck is installed"
|
|
308
|
+
fi
|
|
309
|
+
```
|
|
310
|
+
|
|
311
|
+
### 6. Use [[ ]] for Tests
|
|
312
|
+
```bash
|
|
313
|
+
# Preferred in bash
|
|
314
|
+
if [[ "$var" == "value" ]]; then
|
|
315
|
+
# ...
|
|
316
|
+
fi
|
|
317
|
+
|
|
318
|
+
# Use [ ] only for POSIX compliance
|
|
319
|
+
if [ "$var" = "value" ]; then
|
|
320
|
+
# ...
|
|
321
|
+
fi
|
|
322
|
+
```
|
|
323
|
+
|
|
324
|
+
### 7. Handle Errors Appropriately
|
|
325
|
+
```bash
|
|
326
|
+
if ! command; then
|
|
327
|
+
echo "Command failed" >&2
|
|
328
|
+
exit 1
|
|
329
|
+
fi
|
|
330
|
+
|
|
331
|
+
command || { echo "Failed" >&2; exit 1; }
|
|
332
|
+
```
|
|
333
|
+
|
|
334
|
+
### 8. Use Meaningful Variable Names
|
|
335
|
+
```bash
|
|
336
|
+
# Good
|
|
337
|
+
user_count=10
|
|
338
|
+
max_retries=3
|
|
339
|
+
|
|
340
|
+
# Bad
|
|
341
|
+
n=10
|
|
342
|
+
x=3
|
|
343
|
+
```
|
|
344
|
+
|
|
345
|
+
### 9. Add Comments
|
|
346
|
+
```bash
|
|
347
|
+
# Explain complex logic
|
|
348
|
+
# Document function parameters
|
|
349
|
+
# Clarify non-obvious behavior
|
|
350
|
+
```
|
|
351
|
+
|
|
352
|
+
### 10. Use Functions for Reusability
|
|
353
|
+
```bash
|
|
354
|
+
log_error() {
|
|
355
|
+
echo "[ERROR] $*" >&2
|
|
356
|
+
}
|
|
357
|
+
|
|
358
|
+
log_info() {
|
|
359
|
+
echo "[INFO] $*"
|
|
360
|
+
}
|
|
361
|
+
```
|
|
362
|
+
|
|
363
|
+
## Common Pitfalls
|
|
364
|
+
|
|
365
|
+
### 1. Unquoted Variables
|
|
366
|
+
```bash
|
|
367
|
+
# Wrong
|
|
368
|
+
file=/path/with spaces/file.txt
|
|
369
|
+
cat $file # Fails!
|
|
370
|
+
|
|
371
|
+
# Right
|
|
372
|
+
file="/path/with spaces/file.txt"
|
|
373
|
+
cat "$file"
|
|
374
|
+
```
|
|
375
|
+
|
|
376
|
+
### 2. Not Checking Return Codes
|
|
377
|
+
```bash
|
|
378
|
+
# Wrong
|
|
379
|
+
cd /some/directory
|
|
380
|
+
rm -rf * # Dangerous if cd fails!
|
|
381
|
+
|
|
382
|
+
# Right
|
|
383
|
+
cd /some/directory || exit 1
|
|
384
|
+
rm -rf *
|
|
385
|
+
```
|
|
386
|
+
|
|
387
|
+
### 3. Using [ ] with Bash Features
|
|
388
|
+
```bash
|
|
389
|
+
# Wrong
|
|
390
|
+
if [ "$var" == pattern* ]; then # == not in POSIX
|
|
391
|
+
|
|
392
|
+
# Right (bash)
|
|
393
|
+
if [[ "$var" == pattern* ]]; then
|
|
394
|
+
|
|
395
|
+
# Right (POSIX)
|
|
396
|
+
if [ "$var" = "exact" ]; then
|
|
397
|
+
```
|
|
398
|
+
|
|
399
|
+
### 4. Word Splitting Issues
|
|
400
|
+
```bash
|
|
401
|
+
# Wrong
|
|
402
|
+
files=$(ls *.txt)
|
|
403
|
+
for file in $files; do # Breaks on spaces
|
|
404
|
+
echo "$file"
|
|
405
|
+
done
|
|
406
|
+
|
|
407
|
+
# Right
|
|
408
|
+
for file in *.txt; do
|
|
409
|
+
echo "$file"
|
|
410
|
+
done
|
|
411
|
+
```
|
|
412
|
+
|
|
413
|
+
### 5. Not Using Local in Functions
|
|
414
|
+
```bash
|
|
415
|
+
# Wrong - pollutes global scope
|
|
416
|
+
function bad {
|
|
417
|
+
var="value"
|
|
418
|
+
}
|
|
419
|
+
|
|
420
|
+
# Right
|
|
421
|
+
function good {
|
|
422
|
+
local var="value"
|
|
423
|
+
}
|
|
424
|
+
```
|
|
425
|
+
|
|
426
|
+
## Parameter Expansion Reference
|
|
427
|
+
|
|
428
|
+
```bash
|
|
429
|
+
${var} # Value of var
|
|
430
|
+
${var:-default} # Use default if var is unset
|
|
431
|
+
${var:=default} # Assign default if var is unset
|
|
432
|
+
${var:?error} # Error if var is unset
|
|
433
|
+
${var:+alternate} # Use alternate if var is set
|
|
434
|
+
${#var} # Length of var
|
|
435
|
+
${var:offset:length} # Substring
|
|
436
|
+
${var#pattern} # Remove shortest match from beginning
|
|
437
|
+
${var##pattern} # Remove longest match from beginning
|
|
438
|
+
${var%pattern} # Remove shortest match from end
|
|
439
|
+
${var%%pattern} # Remove longest match from end
|
|
440
|
+
${var/pattern/replacement} # Replace first match
|
|
441
|
+
${var//pattern/replacement} # Replace all matches
|
|
442
|
+
${var^} # Uppercase first character
|
|
443
|
+
${var^^} # Uppercase all
|
|
444
|
+
${var,} # Lowercase first character
|
|
445
|
+
${var,,} # Lowercase all
|
|
446
|
+
```
|
|
447
|
+
|
|
448
|
+
## Special Variables
|
|
449
|
+
|
|
450
|
+
```bash
|
|
451
|
+
$0 # Script name
|
|
452
|
+
$1-$9 # Positional parameters
|
|
453
|
+
${10} # 10th parameter (braces required)
|
|
454
|
+
$# # Number of positional parameters
|
|
455
|
+
$* # All positional parameters (as single word)
|
|
456
|
+
$@ # All positional parameters (as separate words)
|
|
457
|
+
$$ # Process ID of shell
|
|
458
|
+
$! # PID of last background command
|
|
459
|
+
$? # Exit status of last command
|
|
460
|
+
$_ # Last argument of previous command
|
|
461
|
+
```
|
|
462
|
+
|
|
463
|
+
## Resources
|
|
464
|
+
|
|
465
|
+
- [Official GNU Bash Manual](https://www.gnu.org/software/bash/manual/)
|
|
466
|
+
- [Bash Guide for Beginners](http://tldp.org/LDP/Bash-Beginners-Guide/html/)
|
|
467
|
+
- [Advanced Bash-Scripting Guide](https://tldp.org/LDP/abs/html/)
|
|
468
|
+
- [ShellCheck](https://www.shellcheck.net/) - Linting tool
|