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

一个Linux终端充满了笔记本电脑上的文本。

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

什么是特殊字符?

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

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

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

〜主目录

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

  cd~ 

终端窗口中的“cd~”命令。

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

  cd~ / work / archive 

终端窗口中的“cd~ / work / archive”命令。

当前目录

句点(。)表示当前目录。 如果对ls使用-a (all)选项,则会在目录列表中看到它。

  ls -a 

终端窗口中的“ls -a”命令。

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

  ./script.sh 

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

终端窗口中的“./script.sh”命令。

..父目录

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

  cd .. 

终端窗口中的“cd ..”命令。

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

您还可以使用此技术快速移动到目录树中与当前目录树相同级别的目录。 你跳了一个级别,然后一个级别退回到另一个目录。

  cd ../gc_help 

终端窗口中的“cd ../gc_help”命令。

/路径目录分隔符

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

  ls~ / work / archive 

终端窗口中的“ls~ / work / archive”命令。

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

  cd / 

终端窗口中的“cd /”命令。

#评论或修剪字符串

大多数情况下,您使用散列或数字符号(#)告诉shell后面的注释是什么,它不应该对它起作用。 您可以在shell脚本中使用它,而不是在命令行中使用它。

  #这将被Bash shell忽略 

终端窗口中的“#”命令。

但是,它并没有被真正忽略,因为它已添加到命令历史记录中。

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

在这个例子中,我们将文本“Dave Geek!”分配给变量。

  this_string =“Dave Geek!” 

终端窗口中的“this_string ='Dave Geek!'”命令。

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

  echo How-To $ {this_string#Dave} 

终端窗口中的“echo How-To $ {this_string#Dave}”命令。

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

  echo $ this_string 

终端窗口中的“echo $ this_string”命令。

单字符通配符

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

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

  ls徽章?.txt 

这将翻译为“列出名称以'badge'开头的任何文件,并在文件扩展名之前跟随任何单个字符。”

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

终端窗口中的“ls badge?.txt”命令。

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

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

  ls ?????。txt 

终端窗口中的“ls ?????。txt”命令。

*字符序列通配符

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

  ls徽章* 

这符合以下所有条件:

终端窗口中的“ls badge *”命令。

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

无论文件扩展名如何,此命令都匹配所有名为“source”的文件。

 来源。* 

终端窗口中的“ls source。*”命令。

[]字符集通配符

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

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

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

  ls badge_0 [246] .txt 

终端窗口中的“ls badge_0 [246] .txt”命令。

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

  ls badge_ [01] [789] .txt 

终端窗口中的“ls badge_ [01] [789] .txt”命令。

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

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

终端窗口中的“ls badge_ [23] [1-5] .txt”命令。

; Shell命令分隔符

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

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

终端窗口中的“ls> count.txt; wc -l count.txt; rm count.txt”命令

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

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

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

终端窗口中的“cd ./doesntexist && cp~ / Documents / reports / *。”命令。

&背景流程

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

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

  gedit command_address.page& 

终端窗口中的“gedit command_address.page&”命令。

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

<输入重定向

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

  sort <words.txt 

终端窗口中的“sort <words.txt”命令。

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

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

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

  wc words.txt 
  wc <words.txt 

终端窗口中的“wc words.txt”命令。

>输出重定向

您可以使用直角括号(>)将命令的输出重定向(通常,重命名为文件); 这是一个例子:

  ls> files.txt 
  cat files.txt 

终端窗口中的“ls> files.txt”命令。

如果您使用>的数字(在我们的示例中为2),输出重定向也可以重定向错误消息。 这是怎么做的:

  wc doesntexist.txt 2> errors.txt 
  cat errors.txt 

终端窗口中的“wc doesntexist.txt 2> errors.txt”命令。

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

|

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

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

我们输入以下内容:

  cat words.txt |  grep [cC] | 排序-r 

终端窗口中的“cat words.txt | grep [cC] | sort -r”命令。

管道逻辑NOT和历史运算符

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

此命令行中有两个命令:

  [!  -d ./backup] && mkdir ./backup 
  • 第一个命令是方括号内的文本;
  • 第二个命令是双&符号&&的文本。

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

因为双和号将两个命令分开,所以如果第一个成功 ,Bash将只执行第二个命令。 然而,这与我们需要的相反。 如果“backup”目录的测试成功,我们不需要创建它。 如果“backup”目录的测试失败,则不会执行第二个命令,并且不会创建丢失的目录。

这是逻辑运算符! 进来。它充当逻辑NOT。 所以,如果测试成功(即目录存在),那么! 转向“不成功”,这是失败 因此,第二个命令激活。

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

那个小! 当你需要时,它会打包很多!

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

  ls -l -d backup 

终端窗口中的“[!-d ./backup] && mkdir ./backup”命令。

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

  !24 

终端窗口中的“!24”命令。

以下重新运行上一个命令:

  

$ Variable Expressions

在Bash shell中,您可以创建用于保存值的变量。 有些像环境变量一样存在,您可以在打开终端窗口时随时访问它们。 这些包含值,例如您的用户名,主目录和路径。

您可以使用echo查看变量保存的值 - 只是在变量名称前面加上美元符号($),如下所示:

  echo $ USER 
  echo $ HOME 
  echo $ PATH 

终端窗口中的“echo $ USER”命令。

要创建变量,必须为其指定名称并为其保留值。 不必使用美元符号来创建变量。 您只在引用变量时添加$ ,例如在以下示例中:

  ThisDistro = Ubuntu的 
 为mynumber = 2001 
  echo $ ThisDistro 
  echo $ MyNumber 

终端窗口中的“ThisDistro = Ubuntu”命令。

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

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

  MyString的= 123456qwerty 

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

  echo $ {MyString} 

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

  echo $ {myString:6} 

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

  echo $ {myString:0:6} 

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

  echo $ {myString:4:4} 

终端窗口中的“MyString = 123456qwerty”命令。

引用特殊字符

如果要将特殊字符用作文字(非特殊)字符,则必须告诉Bash shell。 这称为引用,有三种方法可以做到。

如果将文本用引号(“...”)括起来,这可以防止Bash对大多数特殊字符起作用,并且它们只是打印。 但一个值得注意的例外是美元符号($)。 它仍然作为变量表达式的字符,因此您可以在输出中包含变量的值。

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

 echo“今天是$(约会)” 

如果将文本用单引号('...')括起来,如下所示,它将停止所有特殊字符的功能:

  echo'今天是$(约会)' 

您可以使用反斜杠(\)来防止后续字符作为特殊字符。 这被称为“逃避”角色; 看下面的例子:

 echo“今天是\ $(日期)” 

终端窗口中的“echo”'今天是$(日期)'“命令。

只需将特殊字符视为非常短的命令即可。 如果你记住它们的用途,它可以使你对Bash shell和其他人的脚本的理解受益匪浅。

相关: 37个你应该知道的重要Linux命令

赞 (0)
分享到:更多 ()