1. 程式人生 > >shell中單引號、雙引號、反斜杠簡說

shell中單引號、雙引號、反斜杠簡說

能夠 col 都是 嵌套 修改文件 字符 變量名 令行 文件中

需求:ssh遠程修改文件,變量從文件中獲取,插入遠程服務器的文件裏 shell腳本中的單引號和雙引號一樣都是字符串的界定符,而不是字符的界定符。單引號用於保持引號內所有字符的字面值,即使引號內的\和回車也不例外,但是字符串中不能出現單引號。(註意是所有,只是單引號本身不能夠出現在其中)。 雙引號用於保持引號內所有字符的字面值(回車也不例外),但以下情況除外:
  • $加變量名可以取變量的值
  • 反引號仍表示命令替換
  • \$表示$的字面值
  • \`表示`的字面值
  • \"表示"的字面值
  • \\表示\的字面值
  • 除以上情況之外,在其它字符前面的\無特殊含義,只表示字面值。
從網上多個貼上發現,我一直在範一個錯誤,高估了shell的對引號的處理邏輯 對於引號來說,第一個引號出現,到第二個引號算作一對,並不會聰明的去判斷其實第一個引號和第四個引號才是一對。 1、單引號
單引號用於保持引號內所有字符的字面值,即使引號內的\和回車也不例外,但是字符串中不能出現單引號 當shell碰到第一個單引號時,它忽略掉其後直到第二個單引號的所有特殊字符 2、雙引號 在雙引號內,不被忽略的符號:`、$、\ 3、反引號 命令替換是指shell能夠將一個命令的標準輸出插在一個命令行中任何位置。shell中有兩種方法作命令替換:把shell命令用反引號或者$(...)結構括起來,其中,$(...)格式受到POSIX標準支持,也利於嵌套。 反引號和$()的功能是命令替換,將反引號或$()中的字符串做為命令來執行,我們在用shell編程時經常用的到 將系統命令的執行結果賦給一個變量 但反引號內不能再引用反引號,而$()中可以引用反引號 [[email protected]
/* */ bin]# s=$(echo date) [[email protected] bin]# echo $s date [[email protected] bin]# s=$(echo `date`) [[email protected] bin]# echo $s Sat Aug 12 11:35:20 CST 2017 4、反斜杠 反斜杠一般用作轉義字符,或稱逃脫字符,linux如果echo要讓轉義字符發生作用,就要使用-e選項,且轉義字符要使用雙引號 echo -e "\n" 反斜杠的另一種作用,就是當反斜杠用於一行的最後一個字符時,shell把行尾的反斜杠作為續行,這種結構在分幾行輸入長命令時經常使用。 示例:
1、單引號裏存在單引號
[[email protected] bin]# echo $\‘
[[email protected] bin]# echo -e \047
2、處理文件中存在單引號
[[email protected] package]# echo "mmm‘sss"  | sed s#\#\\\\047#g
mmm\047sss
[[email protected] package]# echo "mmm‘sss"  | sed s/‘""/"\\\047"‘/g
mmm\047sss
[[email protected] package]# echo "mmm‘sss"  | sed "s/‘/\\\\047/g"
mmm\047sss
3、單引號裏可以打印變量嗎?
[[email protected] ~]# echo "$key"
"$key"
[[email protected] ~]# echo ‘‘$key‘‘
abc
4、遠程處理文件 命令列子:ssh $ip " echo ‘$key=$value‘ >> file "或者ssh $ip " sed -i ‘s/^$key.*/$key=$value/g‘ >> file " 補充:$value變量包含任意字符,即 討論:ssh裏的sed或者echo使用單引號還是雙引號

shell中單引號、雙引號、反斜杠簡說