如果您想在Linux、macOS或其他类似UNIX的系统上掌握bashshell,那么特殊字符(如~、*、|和>;)是至关重要的。我们将帮助您解开这些神秘的Linux命令序列,成为象形文字的英雄。
bashshell以两种不同的方式处理一组字符。当您在shell中键入它们时,它们充当指令或命令,并告诉shell执行特定的功能。可以将它们视为单字符命令。
有时,你只想打印一个字符,而不需要它作为一个魔术符号。有一种方法可以用一个字符来表示它自己,而不是它的特殊功能。
我们将向您展示哪些字符是“特殊”或“元”字符,以及如何从功能和字面上使用它们。
波浪号(~)是主目录的缩写。这意味着您不必在命令中键入主目录的完整路径。在文件系统中的任何位置,都可以使用此命令转到主目录:
cd ~也可以将此命令用于相对路径。例如,如果您位于文件系统中不在主文件夹下的某个位置,并且希望更改为工作目录中的存档目录,请使用颚化符:
cd ~/work/archive句点(.)表示当前目录。如果将-a(all)选项与ls一起使用,则可以在目录列表中看到它。
ls -a您还可以在命令中使用句点来表示当前目录的路径。例如,如果要从当前目录运行脚本,可以这样调用它:
./script.sh这告诉Bash在当前目录中查找脚本.sh文件。这样,它就不会在路径中的目录中搜索匹配的可执行文件或脚本。
双句点或“双点”(..)表示当前目录的父目录。您可以使用它在目录树中向上移动一级。
cd ..您还可以将此命令用于相对路径,例如,如果要在目录树中向上一级,然后在该级输入另一个目录。
您还可以使用此技术快速移动到目录树中与当前目录处于同一级别的目录。你跳上一级,然后又回到另一个目录。
cd ../gc_help您可以使用正斜杠(/)—通常称为斜杠来分隔路径名中的目录。
ls ~/work/archive一个正斜杠表示可能的最短目录路径。由于Linux目录树中的所有内容都从根目录开始,因此可以使用以下命令快速移动到根目录:
cd /大多数情况下,您使用散列或数字符号(#)来告诉shell下面的内容是一个注释,它不应该对其执行操作。您可以在shell脚本中使用它,而在命令行中使用它则不太有用。
# This will be ignored by the Bash shell但是,它并没有真正被忽略,因为它已添加到您的命令历史记录中。
您还可以使用散列来修剪字符串变量并从开头删除一些文本。此命令创建一个名为This\u string的字符串变量。
在本例中,我们指定文本“Dave Geek!“到变量。
this_string="Dave Geek!"此命令使用echo将单词“How to”打印到终端窗口。它通过参数展开检索存储在字符串变量中的值。因为我们附加了散列和文本“Dave”,所以在传递给echo之前,它会修剪掉字符串的这一部分。
echo How-To ${this_string#Dave}这不会更改字符串变量中存储的值;它只影响发送到echo的内容。我们可以使用echo再次打印字符串变量的值并检查:
echo $this_stringbashshell支持三个通配符,其中一个是问号(?)。使用通配符替换文件名模板中的字符。包含通配符的文件名形成了一个模板,该模板匹配一系列文件名,而不仅仅是一个文件名。
问号通配符正好代表一个字符。考虑以下文件名模板:
ls badge?.txt这可以翻译为“列出任何文件,其名称以‘badge’开头,后跟文件扩展名之前的任何单个字符。”
它匹配以下文件。请注意,有些文件名的“徽章”部分后面有数字,有些有字母。问号通配符将匹配字母和数字。
文件名模板不匹配“徽章.txt,因为文件名在“badge”和文件扩展名之间没有一个字符。问号通配符必须与文件名中的相应字符匹配。
还可以使用问号查找文件名中具有特定字符数的所有文件。这将列出文件名中正好包含五个字符的所有文本文件:
ls ?????.txt您可以使用星号(*)通配符来表示任何字符序列,不包括任何字符。考虑以下文件名模板:
ls badge*这符合以下所有条件:
它匹配“徽章.txt“因为通配符代表任何字符序列或不代表任何字符。
此命令匹配所有名为“source”的文件,而不考虑文件扩展名。
ls source.*如上所述,问号表示任何单个字符,星号表示任何字符序列(不包括任何字符)。
可以使用方括号([])及其包含的字符形成通配符。文件名中的相关字符必须至少与通配符集中的一个字符匹配。
在本例中,该命令转换为:“扩展名为“.png”的任何文件,文件名以“pipes\u 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/* .在终端窗口中键入命令并完成后,返回命令提示符。通常,这只需要一两分钟。但是,如果启动另一个应用程序(如gedit),则在关闭该应用程序之前不能使用终端窗口。
但是,您可以将应用程序作为后台进程启动并继续使用终端窗口。为此,只需在命令行中添加一个与号:
gedit command_address.page &Bash向您显示启动的进程的进程ID,然后返回到命令行。然后可以继续使用终端窗口。
许多Linux命令接受一个文件作为参数,并从该文件获取数据。这些命令中的大多数还可以从流中获取输入。要创建流,请使用左尖括号(<),如以下示例所示,将文件重定向到命令中:
sort < words.txt当命令将输入重定向到其中时,它的行为可能与从命名文件读取时不同。
如果我们使用wc来计算文件中的单词、行和字符,它会打印值,然后打印文件名。如果我们将文件的内容重定向到wc,它将打印相同的数值,但不知道数据来自的文件的名称。它无法打印文件名。
以下是一些如何使用wc的示例:
wc words.txt wc < words.txt可以使用右尖括号(>)将命令的输出重定向到文件中;下面是一个示例:
ls > files.txt cat files.txt如果将数字(在我们的示例中为2)与>;一起使用,则输出重定向还可以重定向错误消息;。以下是操作方法:
wc doesntexist.txt 2> errors.txt cat errors.txt相关:Linux上的stdin、stdout和stderr是什么?
“管道”将命令链接在一起。它接受一个命令的输出并将其作为输入提供给下一个命令。管道命令的数量(链的长度)是任意的。
在这里,我们将用猫来喂食物的内容文字.txt文件导入grep,grep提取任何包含小写或大写“C”的行。grep然后将这些行传递给sort。sort使用-r(reverse)选项,因此排序的结果将以相反的顺序显示。
我们键入以下内容:
cat words.txt | grep [cC] | sort -r感叹号(!)是一个逻辑运算符,表示不是。
此命令行中有两个命令:
[ ! -d ./backup ] && mkdir ./backup第一个命令使用!作为逻辑运算符。方括号表示要进行测试。d(directory)选项测试是否存在名为backup的目录。第二个命令创建目录。
因为双符号将这两个命令分开,所以只有第一个命令成功,Bash才会执行第二个命令。然而,这与我们需要的恰恰相反。如果对“backup”目录的测试成功,我们就不需要创建它。如果对“backup”目录的测试失败,第二个命令将不会被执行,丢失的目录也不会被创建。
这就是逻辑运算符的位置!进来了。它起着逻辑非门的作用。因此,如果测试成功(即目录存在),则!将其转换为“不成功”,即失败。所以,第二个命令没有被激活。
如果目录测试失败(即目录不存在),则!将响应改为“不失败”,即成功。因此,将执行创建丢失目录的命令。
那个小家伙!当你需要的时候,可以装很多拳头!
要检查备份文件夹的状态,请使用ls命令以及-l(长列表)和-d(目录)选项,如下所示:
ls -l -d backup也可以使用感叹号从命令历史记录中运行命令。history命令列出您的命令历史记录,然后键入要重新运行的命令的编号!如下图所示:
!24以下命令将重新运行上一个命令:
!!在bashshell中,创建变量来保存值。有些变量(如环境变量)总是存在的,您可以在打开终端窗口时随时访问它们。这些值包含用户名、主目录和路径等值。
您可以使用echo查看变量名前面带有美元符号($)的值,如下所示:
echo $USER echo $HOME echo $PATH要创建一个变量,必须给它一个名称并提供一个值让它保存。您不必使用美元符号来创建变量。仅在引用变量时添加$,如以下示例中所示:
ThisDistro=Ubuntu MyNumber=2001 echo $ThisDistro echo $MyNumber在美元符号周围添加大括号({}),并执行参数展开以获取变量的值,并允许进一步转换值。
这将创建一个包含字符串的变量,如下所示:
MyString=123456qwerty使用以下命令将字符串回显到终端窗口:
echo ${MyString}要返回从整个字符串的位置6开始的子字符串,请使用以下命令(偏移量为零,因此第一个位置为零):
echo ${myString:6}如果要回显从位置0开始并包含后面六个字符的子字符串,请使用以下命令:
echo ${myString:0:6}使用以下命令回显从位置4开始并包含下四个字符的子字符串:
echo ${myString:4:4}如果要使用特殊字符作为文本(非特殊)字符,则必须告诉Bash shell。这叫做引用,有三种方法。
如果将文本括在引号(“…”)中,这将阻止Bash对大多数特殊字符执行操作,而它们只是打印。不过,一个值得注意的例外是美元符号($)。它仍然充当变量表达式的字符,因此可以在输出中包含变量的值。
例如,此命令打印日期和时间:
echo "Today is $(date)"如果按如下所示将文本括在单引号(“…”)中,则会停止所有特殊字符的功能:
echo 'Today is $(date)'可以使用反斜杠(\)来防止下列字符用作特殊字符。这称为“转义”字符;请参见下面的示例:
echo "Today is \$(date)"把特殊字符看作是非常简短的命令。如果你记住了它们的用法,它可以极大地帮助你理解bashshell和其他人的脚本。
相关:您应该知道的37条重要的Linux命令
...为用户友好的Linux操作系统(OS)提供了大量功能,而不需要进入终端,但它是操作系统的一个必要元素。与流行的观点相反,命令行甚至可以简化某些操作。 ...
... 如果您刚刚开始或在终端中花费了大量时间,您可能需要自定义外观、感觉和各种属性。我们将向您展示一些有趣的方法来定制终端,使其最适合您的环境和工作流。 ...
...符进行编码。另一方面,Unicode是如此之大,以至于我们需要使用不同的术语来讨论它! ...
...,特别是那些利用其他现有程序的任务。这种自动化通常需要重复几次类似的操作,这正是for循环进入自己的位置。 ...
...端窗口中键入命令所需的时间。为了测试它的速度,我们需要一个25万个数字的列表。 我们键入以下命令,使用time命令查看该过程需要多长时间才能完成: time seq 250000 结果显示在列表下方。即使在我们中等功率的测试PC上,seq...
... shopt内置 shopt内置是bashshell所有版本的一部分,因此不需要安装任何东西。多年来,shopt提供的选项数量稳步增加。所以,Bash的版本越旧,shopt选项的列表就越短。 如果您的机器上似乎有什么不工作,请检查Bash的手册页条目,...
...确保shell配置正确。这些变量还确保终端窗口和shell可能需要引用的任何信息都可用。总的来说,这些变量保存的设置定义了在终端窗口中找到的环境,一直到命令提示符的外观。所以,自然地,它们被称为环境变量。 一些环境...
...命令。也许您以前有在其他操作系统上使用它的经验,不需要解释。它会改变当前的工作目录,对吗?还有什么要知道的? 好吧,比你想象的要多。这里有一些提示和技巧,可能会提高你的工作效率。 标准cd操作 为了完整起见...
...号,然后按回车键。 对于下面的示例,我们键入了一个需要sudo的命令。我们不需要重新输入整行代码,只需输入sudo,就可以省去大量的按键操作!!,如下图: mv ./my_script.sh /usr/local/bin/ sudo !! 因此,您可以从列表中键入相应...
...中。Bash将在路径中找到该程序并为我们运行它。 我们不需要当前目录中的可执行文件,也不需要在程序名前键入“./”,如下所示: sudo mv htg /usr/bin 现在,让我们通过键入以下命令来运行程序: htg 有些东西在运行,但它不是...