需求: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使用單引號還是雙引號