小符号反映大问题,Shell中下划线_与变量的关系。
之前写过一个根据日期和时间自动命名文件名的时候遇到一个问题。
#! /bin/bash read -p "please input the filename:" filename date3=$(date -d '2 days ago' +%Y%m%d) echo $date3 touch /home/${filename}_${date3} touch /home/$filename"_"$date3 touch /home/"$filename_$date3"
输出为三个文件
23:22 20130329
23:22 underline_20130329
23:22 underline_20130329
不是应该三个都一样么,都是filename_date的格式吗,
后来换成了短横线,
#! /bin/bash read -p "please input the filename:" filename date3=$(date -d '2 days ago' +%Y%m%d) echo $date3 touch /home/${filename}-${date3} touch /home/$filename"-"$date3 touch /home/"$filename-$date3"
输出的文件为:
23:24 dash-20130329
23:24 dash-20130329
23:24 dash-20130329
如果自动命名的文件的分隔符用短横线就没有问题,为什么会这样呢。
后来经过学习和研究
shell变量名后面要跟如下内容:非小写字符串(包括大小字符串)、数字或下划线,要么用转义字符“\”或者变量名用大括号。否则就会向本例中shell试图使用filename_作为变量名。除非出现$filename_已经存在的偶然情况,否则该语句不会打印任何内容(为null或空字符串),这就是第一次为什么输出的是文件 20130329的原因。
在shell中,取一个变量值的方法 $varname的语法实际上是常用语法${varname}的简写形式,不管是避免歧义,还是增加可读性,变量加打括号都是一个很好的习惯,不要偷懒不加哟。
P.S. 简易的例子
[root@Linux mybash]# a=a [root@Linux mybash]# b=b [root@Linux mybash]# echo $a$b ab [root@Linux mybash]# echo $a_$b b [root@Linux mybash]# echo $a\_$b a_b [root@Linux mybash]# echo ${a}_${b} #推荐方法 a_b [root@Linux mybash]# echo "$a"_"$b" a_b [root@Linux mybash]# echo $a"_"$b a_b
【推荐】100%开源!大型工业跨平台软件C++源码提供,建模,组态!
【推荐】2025 HarmonyOS 鸿蒙创新赛正式启动,百万大奖等你挑战
【推荐】博客园的心动:当一群程序员决定开源共建一个真诚相亲平台
【推荐】开源 Linux 服务器运维管理面板 1Panel V2 版本正式发布
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 没有调度器的协程不是好协程,零基础深入浅出 C++20 协程
· 别做抢活的导演:代码中的抽象层次原则
· 从 Redis 客户端超时到 .NET 线程池挑战
· C23和C++26的#embed嵌入资源指南
· 「EF Core」框架是如何识别实体类的属性和主键的
· 博客园众包线下沙龙第1期:云栖开发者基地,共建技术新天地
· 别做抢活的导演:代码中的抽象层次原则
· .NET周刊【7月第1期 2025-07-06】
· Claude Code如何集成到VSCode、PyCharm IDE及使用技巧
· 基于外卖系统的RBAC实现