Unix/Linux - 壳引用机制

你好,有抱负的程序员们!今天,我们将深入探讨Unix和Linux中壳引用机制的迷人世界。作为你友好的邻里计算机老师,我将引导你一步一个脚印地开始这段旅程。如果你以前从未编程过,不用担心——我们将从最基础的知识开始,逐步深入学习。那么,拿起一杯咖啡(或者如果你喜欢,一杯茶),我们开始吧!

Unix / Linux - Quoting Mechanisms

元字符

在我们深入引用之前,我们需要了解元字符是什么。在壳中,元字符是具有特殊含义的特殊字符。它们就像你最喜欢的菜肴中的调味料——一点点就能发挥很大的作用!

以下是一些常见的元字符表格:

元字符 含义
* 通配符(匹配任何数量的字符)
? 通配符(匹配任何单个字符)
> 输出重定向
< 输入重定向
& 在后台运行命令
; 命令分隔符
() 组合命令
[] 字符类

让我们看一个例子:

ls *.txt

在这个命令中,* 是一个元字符。它告诉壳列出所有以 .txt 结尾的文件。很酷吧?

但是,如果我们实际上想将这些字符作为常规字符使用呢?这就是引用的用武之地!

单引号

单引号是最简单的引用形式。它们告诉壳将其中的一切视为文字字符。就像给你的话加上一个保护罩!

让我们试一个例子:

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

你能看到每种类型的引号如何影响输出吗?单引号保留一切的字面意义,双引号允许替换,反引号(或 $()) 执行命令替换。

就这样,伙计们!你们已经迈出了进入壳引用机制世界的第一步。记住,熟能生巧,所以不要害怕实验这些概念。在你们知道之前,你们将像专业人士一样引用!

快乐编码,愿壳与你同在!??

Credits: Image by storyset