Shell中的特殊字符

Shell的預處理

當我們在shell中敲擊命令按下enter鍵時,其實bash在這些命令字符送到命令前做了一些處理,這些處理叫expansion,比如“*”字符在shell命令行中有很多意義。在命令行enter后,這些特殊字符將會擴展成另外的一些東西。
echo是shell內建的程序,打印出該命令的參數(shù)到stdout。但是如果是echo *,命令將不是打印出*而是另外一些東西。shell在echo命令執(zhí)行之前將*擴展成了另外的東西。

  1. 通配符“*”的工作機制被稱為pathname expansion。


    通配符*
  2. ”在單詞前擴展為該單詞名稱的家目錄,如syl。
    ~家目錄
  3. “$”是算術擴展。echo $((expression)),可以嵌套。echo $((2 + 2));echo $(($((5**2)) * 3))。
    $算術擴展
  4. {}花括號擴展??梢愿鶕?jù)花括號中的模型pattern創(chuàng)建多個text字符串


    花括號擴展
  5. 參數(shù)擴展parameter expansion。在系統(tǒng)中存儲著一些有名字的數(shù)據(jù)集,實際上這些數(shù)據(jù)集叫做變量。echo $USER顯示USER變量的內容。想要知道可用的變量列表可以printenv | less。


    變量擴展
  6. 命令替換??梢宰屛覀兪褂靡粋€命令的輸出作為另一個命令的參數(shù)。


    命令替換

引號的使用

出現(xiàn)問題
  • 忽略了參數(shù)中多余的空格
  • 由于$1是一個沒有定義的變量所以為空字符

引號的出現(xiàn)解決這些問題。

雙引號

將字符放在雙引號內,shell中那些擁有特有含義的字符就失去了這些特殊含義,只是普通的字符文本,但是其中“$”“\”“`”三個例外。


出現(xiàn)問題

ls命令會認為這是兩個參數(shù)。用ls -l "two words.txt"就可以去除空格的影響,修復mv "two words.txt" two_words.txt。然而$依然可用,echo "$USER $((2 + 2)) $(cal)"。


$依然可用

通常,單詞分割是根據(jù)空格space,制表符tab,換行newlines這些單詞間的分隔符。這就是說,沒有在引號內的spaces,tabs,newlines并不是文本的一部分,他們只是分隔符,因此就變成了多個命令參數(shù)。加上雙引號就取消了這些分隔符的意義,變成一個參數(shù)。
分隔符

單引號

為了消除所有的expansion,使用單引號

單引號

轉義字符

通常在雙引號中出現(xiàn)的消除特殊含義的擴展。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容