Unix / Linux - Shell 引號機制
大家好,有志成為程序員的各位!今天,我們將要探討 Unix 和 Linux 中引人入勝的 shell 引號機制世界。作為你們鄰居的友好計算機老師,我將帶領大家一步步走過這個旅程。別擔心你以前從未編過程序——我們將從最基本的開始,然後逐步學習。所以,來一杯咖啡(或者如果你喜歡,來一杯茶),我們開始吧!
元字符
在我們進行引號之前,我們需要了解元字符是什麼。在 shell 中,元字符是具有特殊含義的特殊字符。它們就像你喜愛的菜肴中的調味料——少許就能發揮大作用!
這裡是一個常見元字符的表格:
元字符 | 含義 |
---|---|
* | 通配符(匹配任何數量的字符) |
? | 通配符(匹配任何單一字符) |
> | 輸出重定向 |
< | 輸入重定向 |
& | 在背景運行命令 |
; | 命令分隔符 |
() | 組合命令 |
[] | 字符類 |
讓我們看一個例子:
ls *.txt
在這個命令中,*
是一個元字符。它告訴 shell 列出所有以 .txt
結尾的文件。很酷吧?
但如果我們真的想將這些字符當作普通字符使用呢?這就是引號的用處!
單引號
單引號是最簡單的引號形式。它告訴 shell 將引號內的一切當作文字字符對待。這就像將你的話語放在一個保護性的氣泡中!
讓我們試一個例子:
echo 'The * is a wildcard character'
輸出:
The * is a wildcard character
看到了嗎?*
沒有擴展為列出所有文件。它被當作了普通字符。
當你想要保留字符串中每個字符的字面值時,單引號非常棒!即使是其他引號字符在單引號內也會失去它們的特殊含義!
echo 'This is a $VARIABLE with "double quotes" inside'
輸出:
This is a $VARIABLE with "double quotes" inside
單引號內的一切都被精確地打印出來。沒有替換,沒有解釋。只是純粹的、未經改動的文本!
雙引號
雙引號比它們的單引號表親更靈活。它們保留了大多數字符的字面值,但仍然允許一些替換。這就像對你的文本的半透膜!
以下是雙引號允許的:
- 變量替換
- 命令替換
- 反斜杠轉義
讓我們看一些例子:
NAME="Alice"
echo "Hello, $NAME!"
輸出:
Hello, Alice!
變量 $NAME
被替換為它的值。神奇!
現在,讓我們試試命令替換:
echo "Today's date is $(date)"
輸出:
Today's date is Tue May 23 10:30:45 PDT 2023
$(date)
部分被替換為 date
命令的輸出。這不是很酷嗎?
但請記住,一些字符在雙引號內仍然保留它們的特殊含義:
echo "This is a newline: \n And this is a tab: \t"
輸出:
This is a newline:
And this is a tab:
\n
和 \t
分別被解釋為換行和制表符。
反引號
反引號,也稱為反撇號,是一種較老的命令替換形式。它們就像從 Unix 的早期日子來的時間旅行者!
它們的使用方法如下:
echo "The current directory contains `ls | wc -l` files"
輸出:
The current directory contains 42 files
反引號內的命令 (ls | wc -l
) 被執行,其輸出被替換到字符串中。
雖然反引號仍然有效,但更現代的 $()
語法通常更受推崇:
echo "The current directory contains $(ls | wc -l) files"
這做同樣的事情,但更容易嵌套,而且在我個人看來,更容易閱讀。這就像從翻蓋手機升級到智能手機——基本功能相同,但更加用戶友好!
準備整合一切
現在,我們已經探索了所有的引號機制,讓我們將它們結合在一個有趣的腳本中:
#!/bin/bash
NAME="World"
GREETING='Hello'
DATE=$(date +"%A, %B %d, %Y")
echo "$GREETING, $NAME!"
echo 'Today is not actually $DATE'
echo "But for real, today is $DATE"
echo "There are `ls | wc -l` files in this directory"
如果我們運行這個腳本,我們可能會得到如下輸出:
Hello, World!
Today is not actually $DATE
But for real, today is Tuesday, May 23, 2023
There are 42 files in this directory
你能看到每種類型的引號是如何影響輸出的嗎?單引號保留一切字面上,雙引號允許替換,而反引號(或 $()
) 執行命令替換。
這就是 shell 引號機制的世界,各位!記住,熟能生巧,所以不要害怕嘗試這些概念。在你還沒有意識到之前,你將會像專家一樣引號!
快樂編程,願 shell 伴你左右!??
Credits: Image by storyset