Unix/Linux - 壳引用机制
你好,有抱负的程序员们!今天,我们将深入探讨Unix和Linux中壳引用机制的迷人世界。作为你友好的邻里计算机老师,我将引导你一步一个脚印地开始这段旅程。如果你以前从未编程过,不用担心——我们将从最基础的知识开始,逐步深入学习。那么,拿起一杯咖啡(或者如果你喜欢,一杯茶),我们开始吧!
元字符
在我们深入引用之前,我们需要了解元字符是什么。在壳中,元字符是具有特殊含义的特殊字符。它们就像你最喜欢的菜肴中的调味料——一点点就能发挥很大的作用!
以下是一些常见的元字符表格:
元字符 | 含义 |
---|---|
* | 通配符(匹配任何数量的字符) |
? | 通配符(匹配任何单个字符) |
> | 输出重定向 |
< | 输入重定向 |
& | 在后台运行命令 |
; | 命令分隔符 |
() | 组合命令 |
[] | 字符类 |
让我们看一个例子:
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
单引号内的一切都被原样打印。没有替换,没有解释。只有纯净的文本!
双引号
双引号比它们单引号的表亲更灵活。它们保留了大多数字符的文字值,但仍然允许一些替换。就像是文本的半透膜!
以下是双引号允许的内容:
- 变量替换
- 命令替换
- 反斜杠转义
让我们看一些例子:
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