Bash脚本变量怎么玩?新手避坑指南来啦!Bash脚本变量攻略,新手必看避坑完全指南


​刚写的脚本为啥总报错?变量赋值 *** 活不生效?​​ 哎,这场景我太熟了!上周帮同事调试个备份脚本,他 *** 活不明白为啥$file_path *** 活读不出值。结果发现这老哥在变量名里加了空格——这种坑新手踩得可不少!今儿咱们就掰开揉碎说说bash变量那些事,保你看完能自己写个自动化脚本。


一、起名是门艺术:变量命名那些坑

​为啥我的变量总显示"command not found"?​​ 八成是起名不规范!记住这三点铁律:

  1. ​别整花活儿​​:只能用字母、数字和下划线,开头必须是字母(比如_2024file合法,2024_file就完犊子)
  2. ​拒绝空格​​:name = "张三"绝对报错,正确姿势name="张三"
  3. ​大小写敏感​​:FileNameFileName和FileNamefilename是两个完全不同的变量

举个活生生的例子:

bash复制
# 作 *** 写法my name="李四"  # 报错!变量名带空格2024file="/tmp" # 报错!数字开头# 正确姿势user_name="王五"backup_dir="/data"

二、赋值操作骚操作:你以为的=不是=

​同样用等号,为啥人家的脚本丝滑运行?​​ 这里头门道可多了:

  • ​基础赋值​​:直接name="值"(注意等号贴紧)
  • ​命令结果赋值​​:用反引号``或$(),比如time=date +%s
  • ​数学计算​​:得用(())包裹,sum=(( ))包裹,sum=(())包裹,sum=((1+2))才有效

看个对比案例:

bash复制
# 错误示范count=1+2  # 实际得到字符串"1+2"echo $count  # 输出1+2# 正确姿势count=$((1+2))echo $count  # 输出3

三、变量七十二变:这些符号要记牢

​遇到${}就发懵?​​ 其实都是保护机制:

  1. ​防粘连​​:echo "文件名${file}2024.log"(不加{}会误读成$file2024)
  2. ​默认值​​:echo ${name:-访客}(变量为空时显示"访客")
  3. ​字符串操作​​:
    • 转大写:${name^^}
    • 截取子串:${string:0:5}(前5个字符)
    • 替换内容:${url/http/https}(替换协议头)

举个实用案例:

bash复制
# 自动生成带时间戳的日志文件log_dir="/var/log"timestamp=$(date +%Y%m%d)log_file="${log_dir}/app_${timestamp}.log"touch "$log_file"

四、特殊变量黑科技:??、?#都是啥

​脚本里那些$开头的神秘符号有啥用?​​ 记住这几个最常用:

符号作用典型场景
$0脚本名称记录运行日志时显示谁在运行
$1第一个参数处理命令行输入,比如./backup.sh /data
$#参数个数判断用户输入参数是否合规
$?上条命令是否成功故障排查时检查哪步出错
$@所有参数列表批量处理文件时传递多个文件名

实战示例:

bash复制
#!/bin/bash# 备份脚本示例if [ $# -eq 0 ]; thenecho "用法:$0 要备份的目录"exit 1fiecho "正在备份:$1"cp -r "$1" "/backup/${1##*/}_$(date +%s)"echo "备份完成!状态码:$?"

五、避坑宝典:血泪教训总结

​上周亲眼见人掉这些坑里:​

  1. ​作用域陷阱​​:在函数里修改的变量,外面居然没变!(记得用local声明局部变量)
  2. ​引号玄学​​:带空格的路径不用引号包裹,直接被拆成多个参数
  3. ​数组乌龙​​:直接echo array只显示第一个元素(得用array只显示第一个元素(得用array只显示第一个元素(得用{array[@]})

补救三件套:

  • 所有变量用双引号包裹:"$var"
  • 修改重要变量前先备份:old_name="$name"
  • 多用set -x调试看执行过程

小编拍大腿

玩转bash变量就像炒菜掌握火候——多练才能不翻车。建议新手先从定时清理日志这种实用脚本写起,边写边试错。对了,最近发现个骚操作:用${RANDOM}生成随机密码,比网上那些密码生成器靠谱多了!记住,脚本写多了自然就悟了,关键是要敢动手试错。