通过跳板机执行远程主机命令时单引号和双引号使用技巧

疑难杂症   bash 引号  
Bash环境中的三种引号
  • 单引号 '
    • 两个单引号包围起来的字符串就是普通的字符串,它将保留原始的字面意思.
  • 双引号 "
    • 两个双引号包围起来的字符串,部分特殊字符将起到它们的作用.
    • 这些特殊字符有: 美元符$, 反斜杠, 反引号, 感叹号!.
  • 反引号 `
    • 两个反引号包围起来的字符串,将作为命令来运行,执行的输出结果作为该反引号的内容,称为命令替换,它有另一种更好的写法: $(command)
脚本示例
  • 操作机名字暂定为 server [192.168.1.1]
  • 跳板节名字暂定为 node [192.168.10.1]
  • 客户机名字暂定为 client[192.168.10.2]
  • 通过操作机通过跳板机修改数据库密码的一个脚本就可以充分表现这几个引号的区别和意义
#!/bin/bash
proxy_cmd="ssh -p$port"  
proxy_scp="scp -qr -P $port"

function initdb {  
    uhost=$2
    upass=$3
    $proxy_cmd $1 "mysql -h$uhost -uroot -p$upass mysql -e '"'update user set Password=password("'"root"'") where User="'"123"'";'"'"
# server对node执行命令需要用双引号包围,但是node对client执行命令也包含双引号,而这个双引号就必须使用单引包围了,保留原始的字面意思,否则会被当成server对node执行的指令
}

function proxy_area {  
    case $1 in 
        "cn")
            proxy_ip="192.168.10.1"
            echo $proxy_ip
                ;;
        "hk")
            proxy_ip="192.168.20.1"
            echo $proxy_ip
            ;;
                        *)
                        echo "error"
                        exit 1
esac  
}
initdb `proxy_area $1` 192.168.10.2 redhat  
# 这里用到了反引号,把proxy_area 函数作为一个命令来执行
# 也可以这样写
initdb $(proxy_area $1)  192.168.10.2 redhat