• 小符号反映大问题,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
  • 相关阅读:
    字符串算法—正则表达式
    字符串算法—字符串搜索
    字符串算法—字典树
    字符串算法—字符串排序(下篇)
    字符串算法—字符串排序(上篇)
    图表算法—最短路径
    基本算法——前缀和与差分
    图论——图的表示
    基本算法——康托展开与逆康托展开
    基本算法——离散化
  • 原文地址:https://www.cnblogs.com/LinuxBlogs/p/4350295.html
Copyright © 2020-2023  润新知