Bash脚本变量怎么玩?新手避坑指南来啦!Bash脚本变量攻略,新手必看避坑完全指南
刚写的脚本为啥总报错?变量赋值 *** 活不生效? 哎,这场景我太熟了!上周帮同事调试个备份脚本,他 *** 活不明白为啥$file_path *** 活读不出值。结果发现这老哥在变量名里加了空格——这种坑新手踩得可不少!今儿咱们就掰开揉碎说说bash变量那些事,保你看完能自己写个自动化脚本。
一、起名是门艺术:变量命名那些坑
为啥我的变量总显示"command not found"? 八成是起名不规范!记住这三点铁律:
- 别整花活儿:只能用字母、数字和下划线,开头必须是字母(比如_2024file合法,2024_file就完犊子)
- 拒绝空格:name = "张三"绝对报错,正确姿势name="张三"
- 大小写敏感:FileName和filename是两个完全不同的变量
举个活生生的例子:
bash复制# 作 *** 写法my name="李四" # 报错!变量名带空格2024file="/tmp" # 报错!数字开头# 正确姿势user_name="王五"backup_dir="/data"
二、赋值操作骚操作:你以为的=不是=
同样用等号,为啥人家的脚本丝滑运行? 这里头门道可多了:
- 基础赋值:直接name="值"(注意等号贴紧)
- 命令结果赋值:用反引号``或$(),比如time=
date +%s
- 数学计算:得用(())包裹,sum=((1+2))才有效
看个对比案例:
bash复制# 错误示范count=1+2 # 实际得到字符串"1+2"echo $count # 输出1+2# 正确姿势count=$((1+2))echo $count # 输出3
三、变量七十二变:这些符号要记牢
遇到${}就发懵? 其实都是保护机制:
- 防粘连:
echo "文件名${file}2024.log"
(不加{}会误读成$file2024) - 默认值:
echo ${name:-访客}
(变量为空时显示"访客") - 字符串操作:
- 转大写:
${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 "备份完成!状态码:$?"
五、避坑宝典:血泪教训总结
上周亲眼见人掉这些坑里:
- 作用域陷阱:在函数里修改的变量,外面居然没变!(记得用local声明局部变量)
- 引号玄学:带空格的路径不用引号包裹,直接被拆成多个参数
- 数组乌龙:直接echo array只显示第一个元素(得用{array[@]})
补救三件套:
- 所有变量用双引号包裹:"$var"
- 修改重要变量前先备份:old_name="$name"
- 多用set -x调试看执行过程
小编拍大腿
玩转bash变量就像炒菜掌握火候——多练才能不翻车。建议新手先从定时清理日志这种实用脚本写起,边写边试错。对了,最近发现个骚操作:用${RANDOM}生成随机密码,比网上那些密码生成器靠谱多了!记住,脚本写多了自然就悟了,关键是要敢动手试错。