当前位置 主页 > 服务器问题 > Linux/apache问题 >

    shell 里面的奇葩字符实现

    栏目:Linux/apache问题 时间:2020-01-26 20:54

    在我接触过的编程语言里面,最奇葩的两个就属 JavaScript 和 Shell 了。因为它们有着太多的语法糖跟特殊字符,总是能够让你措手不及,并且编程习惯也跟Java 和 Python 等语言大相径庭。总之,千万不要因为它们是脚本语言就轻视它们,否则你就会被打得晕头转向。

    这两个奇葩之间比起来呢,Shell 的奇葩之处在于特殊符号多,骚操作也多。比如你以为 .  这是个点,其实它代表的意思远不止一个点那么简单 。

    下面的内容是我根据网上资料及平时使用经验整理的一份Shell 中的特殊字符。如果大家觉得有用的话就点赞收藏吧。

    ; 单分号,一般作为命令分隔符。可以将两个命令放在同一行。如: echo hello; echo there,但真正写脚本的时候尽量不要这样写。

    ;; 双分号,用在 case条件语句的结束符。如:

    case "$variable" in
     abc) echo "\$variable = abc" ;;
     xyz) echo "\$variable = xyz" ;;
    esac
    

    % 百分号,用于表示取余操作,也用于正则表达式。

    ~  波浪线,表示家目录,等价于$HOME。如 cd ~

    ~+  表示当前工作目录,等价于$PWD。

    ~-  表示上一个工作目录,等价于 ..。

    |  管道标识符,将上一个命令的输出作为下一个命令的输入,经常用到,没什么好说的。

    >|  强制重定向。强制重写已经存在的文件。

    ||  表示逻辑或操作。

    &  让命令在后台运行,例如 command &  一般用于启动后台进程服务。

    &&  表示逻辑与操作。

    * 星号,主要用于通配符匹配,当然也用于乘法表达式。

    \ 主要用于转义特殊字符,比如想转义双引号,可以这样 echo \" 输出 “。

    /  文件路径分隔符,比如 /opt/app/projects/ 。当然也用作除法表达式。

    . 点号,这个符号作用比较多。 首先可以等价于 source 命令。也可以作为文件名字,在文件名开头,表示该文件是个隐藏文件。 还可以表示当前目录, 比如拷贝某个文件到当前目录 cp /opt/app/a.md . 。如果是两个连续的点则表示上一级目录,比如 cd ..。
    最后,点号也是正则表达式的元字符。

    "  双引号,双引号里面的变量一般会被解析成赋值的内容。比如

     name=frank
     echo "hello $name" # hello frank
    

    ' 单引号,单引号里面的变量一般不会被解析,比如

     name=frank
     echo 'hello $name' #hello $name
    

    ' 反引号(ESC键下面那个),要跟单引号区分开。反引号里面的内容会被当作指令执行,并将执行的结果赋值给变量。比如:

    file=`ls ~`
    echo $file #家目录下所有文件。
    

    !  感叹号,一般用于取反。比如 != 表示不等。骚操作在终端中执行,可以表示历史指令比如 !-3,将会输出你刚刚输入的指令。但在脚本中不支持该种写法。

    **  双星号,算术运算中表示求幂运算。比如

    let "a=3**2"
    echo $a #9
    

    ?  问号,表示条件测试;也用作三元运算符。也是正则表达式元字符。

    $  美元符,放到变量前面,即引用一个变量的内容,比如:echo $PATH;当然也是正则表达式的元字符。

    ${} 参数替换。用于在字符串中表示变量值。比如

    name=frank
    echo "hello ${name}" #hello frank
    

    $*,$@ 这两个特殊字符都用于获取传递给脚本的所有参数。当他们被双引号包围时,"$*"会将所有的参数从整体上看做一份数据。而"$@"仍然将每个参数都看作一份数据,彼此之间是独立的。