Unix / Linux - Shell 引號機制

大家好,有志成為程序員的各位!今天,我們將要探討 Unix 和 Linux 中引人入勝的 shell 引號機制世界。作為你們鄰居的友好計算機老師,我將帶領大家一步步走過這個旅程。別擔心你以前從未編過程序——我們將從最基本的開始,然後逐步學習。所以,來一杯咖啡(或者如果你喜歡,來一杯茶),我們開始吧!

Unix / Linux - Quoting Mechanisms

元字符

在我們進行引號之前,我們需要了解元字符是什麼。在 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

單引號內的一切都被精確地打印出來。沒有替換,沒有解釋。只是純粹的、未經改動的文本!

雙引號

雙引號比它們的單引號表親更靈活。它們保留了大多數字符的字面值,但仍然允許一些替換。這就像對你的文本的半透膜!

以下是雙引號允許的:

  1. 變量替換
  2. 命令替換
  3. 反斜杠轉義

讓我們看一些例子:

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