需求:ssh远程修改文件,变量从文件中获取,插入远程服务器的文件里
shell脚本中的单引号和双引号一样都是字符串的界定符,而不是字符的界定符。单引号用于保持引号内所有字符的字面值,即使引号内的\和回车也不例外,但是字符串中不能出现单引号。(注意是所有,只是单引号本身不能够出现在其中)。
双引号用于保持引号内所有字符的字面值(回车也不例外),但以下情况除外:
- $加变量名可以取变量的值
- 反引号仍表示命令替换
- \$表示$的字面值
- \`表示`的字面值
- \"表示"的字面值
- \\表示\的字面值
- 除以上情况之外,在其它字符前面的\无特殊含义,只表示字面值。
从网上多个贴上发现,我一直在范一个错误,高估了shell的对引号的处理逻辑
对于引号来说,第一个引号出现,到第二个引号算作一对,并不会聪明的去判断其实第一个引号和第四个引号才是一对。
1、单引号
单引号用于保持引号内所有字符的字面值,即使引号内的\和回车也不例外,但是字符串中不能出现单引号
当shell碰到第一个单引号时,它忽略掉其后直到第二个单引号的所有特殊字符
2、双引号
在双引号内,不被忽略的符号:`、$、\
3、反引号
命令替换是指shell能够将一个命令的标准输出插在一个命令行中任何位置。shell中有两种方法作命令替换:把shell命令用反引号或者$(...)结构括起来,其中,$(...)格式受到POSIX标准支持,也利于嵌套。
反引号和$()的功能是命令替换,将反引号或$()中的字符串做为命令来执行,我们在用shell编程时经常用的到 将系统命令的执行结果赋给一个变量
但反引号内不能再引用反引号,而$()中可以引用反引号
[root@app bin]# s=$(echo date)
[root@app bin]# echo $s
date
[root@app bin]# s=$(echo `date`)
[root@app bin]# echo $s
Sat Aug 12 11:35:20 CST 2017
4、反斜杠
反斜杠一般用作转义字符,或称逃脱字符,linux如果echo要让转义字符发生作用,就要使用-e选项,且转义字符要使用双引号
echo -e "\n"
反斜杠的另一种作用,就是当反斜杠用于一行的最后一个字符时,shell把行尾的反斜杠作为续行,这种结构在分几行输入长命令时经常使用。
示例:
1、单引号里存在单引号
[root@app bin]# echo $'\'' ' [root@app bin]# echo -e '\047' '
2、处理文件中存在单引号
[root@app package]# echo "mmm'sss" | sed s#\'#\\\\047#g mmm\047sss [root@app package]# echo "mmm'sss" | sed 's/'"'"/"\\\047"'/g' mmm\047sss [root@app package]# echo "mmm'sss" | sed "s/'/\\\\047/g" mmm\047sss
3、单引号里可以打印变量吗?
[root@app ~]# echo '"$key"' "$key" [root@app ~]# echo ''$key'' abc
4、远程处理文件
命令列子:ssh $ip " echo '$key=$value' >> file "或者ssh $ip " sed -i 's/^$key.*/$key=$value/g' >> file "
补充:$value变量包含任意字符,即
讨论:ssh里的sed或者echo使用单引号还是双引号