Shell 单引号,双引号,反引号,'' "" ``

基础说明

  • 单引号'str':把单引号内所有的字符都识别为字符串,特殊含义字符都不会识别
  • 双引号"str";双引号在单引号的基础上能识别$(参数替换)和 `(命令替换)
  • 反引号`str`:会把反引号内的内容当做命令先执行

例子

  • 单引号不识别特殊含义字符

    A=pan
    echo 'I have a $A'
    I have an $A
    
    # 单引号内的反引号
    mkdir ~/test_quotation_marks && touch ~/test_quotation_marks/apostrophe && touch ~/test_quotation_marks/double_quotes && touch ~/test_quotation_marks/backticks
    echo '`ls ~/test_quotation_marks`'
    `ls ~/test_quotation_marks`
  • 双引号能识别特殊含义字符

    A=pan
    echo "I have a $A"
    I have a pan
  • 反引号(命令执行)

    mkdir ~/test_quotation_marks && touch ~/test_quotation_marks/apostrophe && touch ~/test_quotation_marks/double_quotes && touch ~/test_quotation_marks/backticks
    echo "`ls ~/test_quotation_marks`"
    apostrophe
    double_quotes
    backticks

综上所述

  • 单引号与双引号的使用场景类似,都是需要字符串作为参数时使用,主要是一个能解析一个不能解析,具体看字符串内容的双引号数量和参数解析需求而选择使用不同的引号包裹。
  • 反应号里面的内容会立即执行,所以用在字符串参数中时需要注意这一点。

一个很骚的例子

  • 拼接字符串参数,并把字符串作为ssh命令的参数送到远端去执行。

  • 前提准备,把自己的公钥放进authorith_keys,以便可以ssh链接自己。

  • 先看脚本

    ## game_cmd
    # 前提准备
    cat ~/.ssh/is_rsa.pub >> ~/.ssh/authorith_keys
    
    PARAMS=axww
    RUN_NODE_KILL_CMD='
        NEED_KILL_PID=`ps -'${PARAMS}' | grep ps | grep '${PARAMS}' | awk '"'"'{print $1}'"'"'`
        echo "查询进程命令:ps -'${PARAMS}' | grep ps | grep '${PARAMS}'其结果为:"
        ps -'${PARAMS}' | grep ps | grep '${PARAMS}'
        echo $NEED_KILL_PID
        echo "杀死ps --'${PARAMS}'进程:$NEED_KILL_PID"
        echo "开个玩笑,根本不用杀"
    '
    
    ssh -p 22 -o StrictHostKeyChecking=no root@127.0.0.1 "${RUN_NODE_KILL_RE_UP_CMD}"
  • 一些解析

    • RUN_NODE_KILL_CMD是一串字符串,是由好多个字符串拼接而成的。
    • 里面的${PARAMS}其实是单纯参数读取,因为前后都加了一个单引号'${PARAMS}'承上启下了而已。
    • NEED_KILL_PID后面是由一个反引号包裹的命令获取一个进程ID,因为有单引号包裹,所以在本机当成了ssh命令的字符串参数,但到了目的机却可以执行。

Shell 单引号,双引号,反引号,'' "" ``
https://qiil.github.io/2023/03/17/Shell-单引号,双引号,反引号,/
作者
QSY
发布于
2023年3月17日
许可协议