Bash你需要知道的15个特殊字符

如果希望在Linux、MacOS或其他类似UNIX的系统上掌握Bash shell,则特殊字符(如~、*、|和>)至关重要。我们将帮助您解开这些神秘的Linux命令序列,成为象形文字的英雄。

什么是特殊字符?

Bash shell以两种不同的方式处理一组字符。当您在shell中键入它们时,它们充当指令或命令,并告诉shell执行某个功能。可以将它们视为单字符命令。

有时,您只想打印一个字符,而不需要它充当魔术符号。有一种方法可以使用字符来表示它自己,而不是它的特殊功能。

我们将向您展示哪些字符是“特殊”或“元”字符,以及如何从功能和字面上使用它们。

~主目录

波浪号(~)是您的主目录的缩写。这意味着您不必在命令中键入主目录的完整路径。无论您在文件系统中的哪个位置,都可以使用此命令转到您的主目录:

cd ~

您还可以将此命令与相对路径一起使用。例如,如果您位于不在主文件夹下的文件系统中的某个位置,并且想要更改到工作目录中的archive目录,请使用波浪号执行此操作:

cd ~/work/archive

。当前目录

句点(.)。表示当前目录。如果将-a(All)选项与ls一起使用,则可以在目录清单中看到它。

ls -a

您还可以在命令中使用句点来表示当前目录的路径。例如,如果要从当前目录运行脚本,可以这样调用:

./script.sh

这告诉Bash在当前目录中查找script.sh文件。这样,它就不会在您的路径中搜索匹配的可执行文件或脚本。

。。父目录

双句点或“双点”(..)。表示当前目录的父目录。您可以使用此选项在目录树中上移一级。

cd ..

您还可以将此命令与相对路径一起使用-例如,如果要在目录树中向上移动一级,然后在该级输入另一个目录。

您还可以使用此技术快速移动到目录树中与当前目录处于同一级别的目录。您向上跳过一层,然后再向下跳回一层到不同的目录中。

cd ../gc_help

/PATH目录分隔符

您可以使用正斜杠(/)(通常简称为斜杠)来分隔路径名中的目录。

ls ~/work/archive

一个正斜杠表示可能的最短目录路径。因为Linux目录树中的所有内容都是从根目录开始的,所以您可以使用以下命令快速移动到根目录:

cd /

#注释或修剪字符串

大多数情况下,您使用散列或数字符号(#)来告诉shell后面的内容是注释,它不应该对其执行操作。您可以在shell脚本中使用它,也可以在命令行上使用(用处较少)。

# This will be ignored by the Bash shell

然而,它并没有真正被忽略,因为它被添加到您的命令历史记录中。

您还可以使用散列来修剪字符串变量并从开头删除一些文本。此命令创建名为this_string的字符串变量。

在本例中,我们将文本指定为“Dave Geek!”添加到变量。

this_string="Dave Geek!"

此命令使用echo将“How-to”字样打印到终端窗口。它还通过扩展参数来检索存储在字符串变量中的值。因为我们附加了散列和文本“Dave”,所以在传递给ECHO之前,它会修剪掉那部分字符串。

echo How-To ${this_string#Dave}

这不会更改存储在字符串变量中的值;它只影响发送给ECHO的内容。我们可以使用echo再次打印字符串变量的值,并检查以下内容:

echo $this_string

?单字符通配符

Bash shell支持三个通配符,其中一个是问号(?)。您可以使用通配符替换文件名模板中的字符。包含通配符的文件名会形成与一定范围的文件名匹配的模板,而不是只与一个文件名匹配。

问号通配符仅代表一个字符。请考虑以下文件名模板:

ls badge?.txt

这可以翻译为“列出名称以‘BAGEE’开头且后跟文件扩展名前的任何单个字符的任何文件”。

它与以下文件匹配。请注意,有些文件名的“徽章”部分后面有数字,有些文件名后面有字母。问号通配符将同时匹配字母和数字。

不过,该文件名模板与“badge.txt”不匹配,因为文件名在“badge”和文件扩展名之间没有一个字符。问号通配符必须与文件名中的相应字符匹配。

您还可以使用问号查找文件名中具有特定字符数的所有文件。这将列出文件名中恰好包含五个字符的所有文本文件:

ls ?????.txt

*字符序列通配符

您可以使用星号(*)通配符代表任何字符序列,包括没有字符。请考虑以下文件名模板:

ls badge*

这符合以下所有条件:

它与“badge.txt”匹配,因为通配符表示任意字符序列或没有字符。

此命令匹配所有名为“source”的文件,而不考虑文件扩展名。

ls source.*

[]字符集通配符

如上所述,您可以使用问号表示任何单个字符,使用星号表示任何字符序列(包括没有字符)。

您可以使用方括号([])及其包含的字符组成通配符。然后,文件名中的相关字符必须与通配符集中的至少一个字符匹配。

在本例中,该命令转换为:“任何扩展名为”.png“的文件,文件名以”Pipes_0“开头,其中下一个字符为”2、4或6。“

ls badge_0[246].txt

每个文件名模板可以使用多组方括号:

ls badge_[01][789].txt

您还可以在字符集中包括范围。以下命令选择文件名中编号为21到25和31到35的文件。

ls badge_[23][1-5].txt

;外壳命令分隔符

只要用分号(;)分隔每个命令,就可以在命令行上键入任意数量的命令。我们将在以下示例中执行此操作:

ls > count.txt; wc -l count.txt; rm count.txt

请注意,第二个命令即使第一个命令失败也会运行,第三个命令即使第二个命令失败也会运行,依此类推。

如果要在一个命令失败时停止执行顺序,请使用双与号(&&)而不是分号:

cd ./doesntexist && cp ~/Documents/reports/* .

后台进程(&B)

在终端窗口中键入命令并完成后,您将返回到命令提示符。通常,这只需要一两分钟。但是,如果您启动另一个应用程序(如Gedit),则在关闭该应用程序之前,您无法使用您的终端窗口。

但是,您可以将应用程序作为后台进程启动,并继续使用终端窗口。要执行此操作,只需在命令行中添加一个“与”号即可:

gedit command_address.page &

Bash显示启动的进程ID,然后返回到命令行。然后,您可以继续使用终端窗口。

<输入重定向

许多Linux命令接受文件作为参数,并从该文件中获取它们的数据。这些命令中的大多数还可以接受来自流的输入。要创建流,可以使用左尖括号(<)将文件重定向到命令中,如下例所示:

sort < words.txt

当命令将输入重定向到其中时,它的行为可能与从命名文件读取时不同。

如果我们使用wc来计算文件中的单词、行和字符,它将打印值,然后打印文件名。如果我们将文件内容重定向到wc,它将打印相同的数字值,但不知道数据来自的文件的名称。它不能打印文件名。

以下是一些如何使用WC的示例:

wc words.txtwc < words.txt

>输出重定向

您可以使用右尖括号(>)将命令的输出重定向(通常是重定向到文件中);下面是一个示例:

ls > files.txtcat files.txt

如果您在“>”中使用数字(在我们的示例中为2),则输出重定向也可以重定向错误消息。以下是如何做到这一点:

wc doesntexist.txt 2> errors.txtcat errors.txt

相关:Linux上的stdin、stdout和stderr是什么?

|管道

“管道”将命令链接在一起。它接受一个命令的输出,并将其作为输入提供给下一个命令。管道命令的数量(链的长度)是任意的。

在这里,我们将使用cat将words.txt文件的内容提供给grep,grep将提取任何包含小写或大写“C”的行。然后,grep将把这些行传递给排序。排序使用-r(反转)选项,因此排序结果将以相反的顺序显示。

我们键入了以下内容:

cat words.txt | grep [cC] | sort -r

太棒了!管道逻辑NOT和历史运算符

感叹号(!)。是表示NOT的逻辑运算符。

此命令行中有两个命令:

[ ! -d ./backup ] && mkdir ./backup

第一个命令是方括号内的文本; 第二个命令是双与号&&后面的文本。

第一个命令使用!作为逻辑运算符。方括号表示要进行测试。-d(目录)选项测试是否存在一个名为backup的目录。第二个命令创建该目录。

由于两个命令之间用双与号分隔,因此Bash只有在第一个命令成功时才会执行第二个命令。然而,这与我们需要的恰恰相反。如果“备份”目录测试成功,我们不需要创建它。如果“备份”目录的测试失败,则不会执行第二个命令,也不会创建丢失的目录。

这就是逻辑运算符的位置!进来吧。它充当逻辑NOT。因此,如果测试成功(即,目录存在),则!把它变成“不成功”,那就是失败。因此,第二个命令没有完全激活。

如果目录测试失败(即,该目录不存在),则!将响应更改为“没有失败”,即成功。因此,执行创建缺失目录的命令。

那个小东西!当你需要它的时候,它会打出很大的一拳!

要检查备份文件夹的状态,请使用ls命令以及-l(长列表)和-d(目录)选项,如下所示:

ls -l -d backup

您还可以使用感叹号从命令历史记录中运行命令。HISTORY命令会列出您的命令历史记录,然后您可以键入要重新运行的命令的编号!要执行它,如下图所示:

!24

以下命令重新运行前面的命令:

!!

$Variable表达式

在Bash shell中,您可以创建变量来保存值。有些变量(如环境变量)始终存在,您可以在打开终端窗口时随时访问它们。这些值包含用户名、主目录和路径等值。

您可以使用ECHO查看变量包含的值-只需在变量名前面加上美元符号($),如下所示:

echo $USERecho $HOMEecho $PATH

要创建变量,必须为其指定名称并提供一个值以供其保存。您不必使用美元符号来创建变量。仅在引用变量时添加$,如下例所示:

ThisDistro=UbuntuMyNumber=2001echo $ThisDistroecho $MyNumber

在美元符号周围添加大括号({})并执行参数扩展以获得变量的值,并允许进一步转换该值。

这将创建一个保存字符串的变量,如下所示:

MyString=123456qwerty

使用以下命令将字符串回显到终端窗口:

echo ${MyString}

要从整个字符串的位置6开始返回子字符串,请使用以下命令(有一个零偏移,因此第一个位置为零):

echo ${myString:6}

如果要回显从位置0开始并包含接下来的6个字符的子字符串,请使用以下命令:

echo ${myString:0:6}

使用以下命令回显从位置4开始并包含接下来的4个字符的子字符串:

echo ${myString:4:4}

引用特殊字符

如果希望将特殊字符用作文字(非特殊)字符,则必须告诉Bash shell。这就是所谓的报价,有三种方法可以做到这一点。

如果将文本用引号引起来(“…”)。,这会阻止Bash作用于大多数特殊字符,而它们只是打印。不过,一个值得注意的例外是美元符号($)。它仍然用作变量表达式的字符,因此您可以在输出中包括来自变量的值。

例如,此命令打印日期和时间:

echo "Today is $(date)"

如果将文本用单引号引起来(‘…’)。如下图所示,停止删除所有特殊字符的功能:

echo 'Today is $(date)'

您可以使用反斜杠(\)来防止以下字符用作特殊字符。这称为“转义”字符;请参见下面的示例:

echo "Today is \$(date)"

只需将特殊字符视为非常简短的命令即可。如果您记住了它们的用法,那么对理解Bash shell和其他人的脚本会大有裨益。

相关:37条您应该知道的重要Linux命令

相关文章