一、基础语法
-
脚本结构
- Shebang 行:指定解释器(如
#!/bin/bash)。 - 注释:以
#开头。 - 执行权限:
chmod +x script.sh赋予执行权限。
- Shebang 行:指定解释器(如
-
命令与参数
- 命令与参数、参数与参数之间必须用空格分隔。
bash
echo "Hello" # 正确 echo"Hello" # 错误(命令与参数粘连) - 引号规则:
- 单引号(
'):保持原样,不解析变量或转义符。 - 双引号(
"):解析变量($var)和转义符(\n)。
bash
name="Alice" echo '$name' # 输出 $name echo "$name" # 输出 Alice - 单引号(
- 命令与参数、参数与参数之间必须用空格分隔。
二、变量与数组
-
变量定义与使用
- 赋值:
变量名=值(等号两侧无空格)。bash
count=10 # 正确 count = 10 # 错误(等号两侧有空格) - 默认值:
${var:-默认值}(避免空值错误)。bash
echo ${name:-"Unknown"} # 若 name 未定义,输出 "Unknown"
- 赋值:
-
数组操作
- 定义数组:
array=(1 "two" 3)。 - 索引差异:
- Bash:索引从
0开始。 - Zsh:索引默认从
1开始(可通过setopt ksh_arrays改为0)。
bash
a=(1 2 3) echo ${a[1]} # Bash 输出 2,Zsh 默认输出 1 - Bash:索引从
- 定义数组:
三、参数传递
-
脚本参数
- 位置参数:
$0(脚本名)、$1-$9(第1-9个参数)。 - 特殊变量:
$#:参数总数。$@:所有参数列表(保留独立性)。
bash
./script.sh a "b c" d echo $1 # 输出 a echo $@ # 输出 a b c d(实际保留引号)
- 位置参数:
-
函数参数
- 函数内使用
$1、$2等接收参数,与脚本参数独立。bash
greet() { echo "Hello, $1"; } greet "Alice" # 输出 Hello, Alice
- 函数内使用
四、流程控制
-
条件判断
- **
if语句**:bash
if [ "$num" -gt 10 ]; then echo "大于10" fi - **
case语句**:bash
case $cmd in "start") echo "启动" ;; *) echo "未知命令" ;; esac
- **
-
循环结构
- **
for循环**:bash
for i in {1..3}; do echo $i done - **
while循环**:bash
while [ $count -lt 5 ]; do echo $count ((count++)) done
- **
五、输入输出重定向
-
基础重定向
- 覆盖写入:
> - 追加写入:
>> - 错误重定向:
2>或2>>bash
echo "Hello" > output.log # 覆盖写入 ls /invalid 2>> error.log # 追加错误日志
- 覆盖写入:
-
管道与复合命令
- 管道:
|将前命令的输出作为后命令的输入。bash
cat file.txt | grep "error" - **
tee命令**:同时输出到屏幕和文件。bash
ls -l | tee files.log
- 管道:
六、调试与优化
-
调试技巧
- 打印命令:
set -x显示每条执行的命令。 - 错误终止:
set -e遇到错误立即退出脚本。bash
#!/bin/bash set -ex # 启用调试和错误终止
- 打印命令:
-
性能优化
- 避免重复调用命令:将结果存入变量。
bash
files=$(ls *.txt) # 替代多次调用 ls - 并行处理:
xargs -P启用多线程。bash
cat urls.txt | xargs -P 4 -I {} curl -O {}
- 避免重复调用命令:将结果存入变量。
七、常见问题解决
- 权限问题
- **
Permission denied**:运行chmod +x script.sh。
- **
- 路径问题
- 使用绝对路径或在脚本中切换目录:
bash
cd "$(dirname "$0")" # 进入脚本所在目录
- 使用绝对路径或在脚本中切换目录:
- 参数含空格
- 用引号包裹参数:
./script.sh "file name.txt"。
- 用引号包裹参数:
总结
Shell 脚本的核心在于 自动化 和 命令组合,通过灵活使用变量、流程控制、重定向和调试工具,可以高效处理文件操作、系统管理、日志分析等任务。关键注意事项包括:
- 严格遵循空格规则(如变量赋值无空格,条件判断加空格)。
- 区分不同 Shell 的特性(如 Bash 与 Zsh 的数组索引)。
- 始终处理含空格的参数和文件名(使用引号或转义符)。
掌握这些技巧后,可逐步编写更健壮、高效的 Shell 脚本!
附:速查表
| 场景 | 命令/语法 | 示例 |
|---|---|---|
| 变量赋值 | var=value | name="Alice" |
| 条件判断 | [ ] 或 [[ ]] | if [ -f "file.txt" ]; then |
| 遍历数组 | for i in "${arr[@]}" | for file in *.txt; do |
| 错误重定向 | 2> | ls /invalid 2> error.log |
| 函数定义 | function name { } | greet() { echo "Hello"; } |
| 脚本参数总数 | $# | echo "参数个数: $#" |
| 获取上条命令退出码 | $? | if [ $? -ne 0 ]; then |
853

被折叠的 条评论
为什么被折叠?



