Shell 脚本语法与使用技巧总结

一、基础语法

  1. 脚本结构

    • Shebang 行:指定解释器(如 #!/bin/bash)。
    • 注释:以 # 开头。
    • 执行权限chmod +x script.sh 赋予执行权限。
  2. 命令与参数

    • 命令与参数、参数与参数之间必须用空格分隔
      
      

      bash

      echo "Hello"  # 正确
      echo"Hello"    # 错误(命令与参数粘连)
    • 引号规则
      • 单引号('):保持原样,不解析变量或转义符。
      • 双引号("):解析变量($var)和转义符(\n)。
      
      

      bash

      name="Alice"
      echo '$name'   # 输出 $name
      echo "$name"   # 输出 Alice

二、变量与数组

  1. 变量定义与使用

    • 赋值变量名=值(等号两侧无空格)。
      
      

      bash

      count=10      # 正确
      count = 10    # 错误(等号两侧有空格)
    • 默认值${var:-默认值}(避免空值错误)。
      
      

      bash

      echo ${name:-"Unknown"}  # 若 name 未定义,输出 "Unknown"
  2. 数组操作

    • 定义数组array=(1 "two" 3)
    • 索引差异
      • Bash:索引从 0 开始。
      • Zsh:索引默认从 1 开始(可通过 setopt ksh_arrays 改为 0)。
      
      

      bash

      a=(1 2 3)
      echo ${a[1]}  # Bash 输出 2,Zsh 默认输出 1

三、参数传递

  1. 脚本参数

    • 位置参数$0(脚本名)、$1-$9(第1-9个参数)。
    • 特殊变量
      • $#:参数总数。
      • $@:所有参数列表(保留独立性)。
      
      

      bash

      ./script.sh a "b c" d
      echo $1        # 输出 a
      echo $@        # 输出 a b c d(实际保留引号)
  2. 函数参数

    • 函数内使用 $1$2 等接收参数,与脚本参数独立。
      
      

      bash

      greet() { echo "Hello, $1"; }
      greet "Alice"  # 输出 Hello, Alice

四、流程控制

  1. 条件判断

    • ​**if 语句**:
      
      

      bash

      if [ "$num" -gt 10 ]; then
          echo "大于10"
      fi
    • ​**case 语句**:
      
      

      bash

      case $cmd in
          "start") echo "启动" ;;
          *)       echo "未知命令" ;;
      esac
  2. 循环结构

    • ​**for 循环**:
      
      

      bash

      for i in {1..3}; do
          echo $i
      done
    • ​**while 循环**:
      
      

      bash

      while [ $count -lt 5 ]; do
          echo $count
          ((count++))
      done

五、输入输出重定向

  1. 基础重定向

    • 覆盖写入>
    • 追加写入>>
    • 错误重定向2> 或 2>>
      
      

      bash

      echo "Hello" > output.log     # 覆盖写入
      ls /invalid 2>> error.log    # 追加错误日志
  2. 管道与复合命令

    • 管道| 将前命令的输出作为后命令的输入。
      
      

      bash

      cat file.txt | grep "error"
    • ​**tee 命令**:同时输出到屏幕和文件。
      
      

      bash

      ls -l | tee files.log

六、调试与优化

  1. 调试技巧

    • 打印命令set -x 显示每条执行的命令。
    • 错误终止set -e 遇到错误立即退出脚本。
      
      

      bash

      #!/bin/bash
      set -ex  # 启用调试和错误终止
  2. 性能优化

    • 避免重复调用命令:将结果存入变量。
      
      

      bash

      files=$(ls *.txt)  # 替代多次调用 ls
    • 并行处理xargs -P 启用多线程。
      
      

      bash

      cat urls.txt | xargs -P 4 -I {} curl -O {}

七、常见问题解决

  1. 权限问题
    • ​**Permission denied**:运行 chmod +x script.sh
  2. 路径问题
    • 使用绝对路径或在脚本中切换目录:
      
      

      bash

      cd "$(dirname "$0")"  # 进入脚本所在目录
  3. 参数含空格
    • 用引号包裹参数:./script.sh "file name.txt"

总结

Shell 脚本的核心在于 ​自动化 和 ​命令组合,通过灵活使用变量、流程控制、重定向和调试工具,可以高效处理文件操作、系统管理、日志分析等任务。关键注意事项包括:

  • 严格遵循空格规则(如变量赋值无空格,条件判断加空格)。
  • 区分不同 Shell 的特性(如 Bash 与 Zsh 的数组索引)。
  • 始终处理含空格的参数和文件名(使用引号或转义符)。

掌握这些技巧后,可逐步编写更健壮、高效的 Shell 脚本!


附:速查表

场景命令/语法示例
变量赋值var=valuename="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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值