zoukankan      html  css  js  c++  java
  • 小符号反映大问题,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
  • 相关阅读:
    html5 自定义属性data-*
    企业微信接口授权
    js对象---字符串
    谈谈html5新增的元素及其他功能
    模拟缓存
    jdbc数据库连接
    面向对象的理解
    最简单的Spring+SpringMVC+Mybatis的整合
    EF报错 附加类型model失败
    c# Web服务远程“调用”调试
  • 原文地址:https://www.cnblogs.com/LinuxBlogs/p/4350295.html
Copyright © 2011-2022 走看看