一、基础语法
- 
	脚本结构 - 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 | 
 
                   
                   
                   
                   
       
           
                 
                 
                 
                 
                 
                
               
                 
                 
                 
                 
                
               
                 
                 扫一扫
扫一扫
                     
              
             
                   168
					168
					
 被折叠的  条评论
		 为什么被折叠?
被折叠的  条评论
		 为什么被折叠?
		 
		  到【灌水乐园】发言
到【灌水乐园】发言                                
		 
		 
    
   
    
   
             
            


 
            