type命令告诉我们作为其参数传递给它的命令是shell内置命令、二进制可执行文件、别名还是函数。它向我们报告说Echo是一个贝壳结构。
一旦找到答案,TYPE就会停止查找更多的匹配项。因此,它不会告诉我们系统中是否存在同名的其他命令。但它确实告诉我们它最先找到的是哪一个。这就是我们发出该命令时默认使用的命令。
Where is命令查找我们作为其命令行参数传递给它的命令的二进制可执行文件、源代码和手册页。它不查找shell内置,因为它们没有单独的二进制可执行文件。它们是Bash可执行文件不可分割的一部分。
Where is命令报告echo是位于/bin目录中的二进制可执行文件。
要使用该版本的ECHO,您需要通过在命令行上提供可执行文件的路径来显式调用它:
/bin/echo --version
shell内置不知道--version命令行参数是什么,它只是在终端窗口中重复该参数:
echo --version
这里显示的示例都使用Bash shell中的默认版本ECHO。
将文本写入终端
要将简单的文本字符串写入终端窗口,请键入echo和您希望它显示的字符串:
echo My name is Dave.
课文为我们重复了一遍。但是随着您的实验,您很快就会发现事情可能会变得稍微复杂一些。请看此示例:
echo My name is Dave and I'm a geek.
终端窗口显示了一个“”>“”标志,并坐在那里等待。Ctrl+C将使您返回到命令提示符。那里发生了什么事?
单词“I‘m”中的单引号或撇号令人困惑。它将该单引号解释为引号文本部分的开始。因为没有检测到结束的单引号,Echo正在等待更多的输入。它预计进一步的输入将包括它正在等待的缺失的单引号。
要在字符串中包含单引号,最简单的解决方案是将整个字符串用双引号括起来:
echo "My name is Dave and I'm a geek."
用双引号将文本括起来是很好的一般性建议。在脚本中,它清楚地分隔您传递给ECHO的参数。这使得读取和调试脚本变得容易得多。
如果要在文本字符串中包含双引号字符,该怎么办?这很简单,只需在双引号前面加一个反斜杠(中间没有空格)。
echo "My name is Dave and I'm a \"geek.\""
这为我们用双引号将单词“geek”括起来。“我们很快就会看到更多这样的反斜杠转义字符。
将变量与ECHO一起使用
到目前为止,我们一直在向终端窗口写入预定义文本。我们可以使用带有ECHO的变量来生成更具动态性的输出,并且可以通过shell为我们插入值。我们可以使用以下命令定义一个简单的变量:
my_name="Dave"
已经创建了一个名为MY_NAME的变量。它已被赋予文本“Dave”的值。我们可以在传递给ECHO的字符串中使用变量名,变量的值将写入终端窗口。您必须在变量名前面放一个美元符号$,以让echo知道它是一个变量。
有一个警告。如果您用单引号将字符串括起来,ECHO将按字面意思对待所有内容。要显示变量值,而不是变量名称,请使用双引号。
echo 'My name is $my_name'
echo "My name is $my_name"
在某种程度上说得恰如其分,这是值得重复的:
使用单引号会导致文本以文字方式写入终端窗口。 使用双引号会导致解释变量-也称为变量展开-并将值写入终端窗口。
相关:如何在Bash中使用变量
将命令与ECHO配合使用
我们可以使用带有ECHO的命令,并将其输出合并到写入终端窗口的字符串中。我们必须将美元符号$当作命令是一个变量来使用,并将整个命令括在圆括号中。
我们将使用DATE命令。一个技巧是在开始将该命令与ECHO一起使用之前单独使用该命令。这样,如果命令的语法有问题,您可以在将其包含在echo命令中之前识别并更正它。然后,如果ECHO命令没有执行预期的操作,您就会知道问题一定出在ECHO语法上,因为您已经验证了该命令的语法。
因此,在终端窗口中尝试执行以下操作:
date +%D
而且,由于我们从date命令获得了预期的结果,因此我们将把它集成到一个echo命令中:
echo "Today's date is: $(date +%D)"
注意,命令在括号内,美元符号$1紧接在第一个括号之前。
使用回显设置文本格式
e(启用反斜杠转义)选项允许我们使用一些反斜杠转义字符来更改文本布局。以下是我们可以使用的反斜杠转义字符:
\a:警报(历史上称为BEL)。这将生成默认的警报声。 \B:写入退格字符。 \c:放弃任何进一步的输出。 \e:写入转义字符。 \f:写入换页符。 \n:写新行。 \r:写入回车。 \t:写入水平制表符。 \v:写入垂直制表符。 \\:写入反斜杠字符。
让我们使用其中的一些,看看它们会做什么。
echo -e "This is a long line of text\nsplit across three lines\nwith\ttabs\ton\tthe\tthird\tline"
文本被拆分为一个新行,我们在该行中使用了\n字符,并在我们使用了\t字符的位置插入了制表符。
echo -e "Here\vare\vvertical\vtabs"
与\n换行符一样,垂直制表符将文本移至下一行。但是,与第n个换行符不同,\v垂直制表符不会从第0列开始新行。它使用当前列。
\b退格字符将光标向后移动一个字符。如果有更多的文本要写入终端,则该文本将覆盖前一个字符。
echo -e "123\b4"
“3”被“4”覆盖。
回车字符\r会使回显返回到当前行的开头,并从第0列写入任何进一步的文本。
echo -e "123\r456"
“123”字符被“456”字符覆盖。
\a警报字符将发出可听到的“哔哔”声。它使用当前主题的默认警报声。
echo -e "Make a bleep\a"
n(没有换行符)选项不是反斜杠转义序列,但它确实会影响文本布局的美观,因此我们将在这里讨论它。它可以防止Echo在文本末尾添加换行符。命令提示符紧跟在写入终端窗口的文本之后。
echo -n "no final newline"
对文件和目录使用ECHO
您可以使用echo作为穷人版本的ls。当您像这样使用ECHO时,您的选择很少。如果您需要任何形式的保真度或精细控制,最好使用ls及其众多选项。
此命令列出当前目录中的所有文件和目录:
echo *
此命令列出当前目录中名称以“D”开头的所有文件和目录:
echo D*
此命令列出当前目录中的所有“.ktop”文件:
echo *.desktop
嗯。这不是在发挥埃科的长处。使用ls。
使用ECHO写入文件
我们可以重定向来自ECHO的输出,并创建文本文件或写入现有文本文件。
如果我们使用>重定向操作符,则在文件不存在时创建该文件。如果该文件确实存在,来自ECHO的输出将添加到该文件的开头,覆盖以前的任何内容。
如果我们使用>>重定向操作符,则在文件不存在时创建该文件。ECHO的输出将添加到文件的末尾,并且不会覆盖文件的任何现有内容。
echo "Creating a new file." > sample.txt
echo "Adding to the file." >> sample.txt
cat sample.txt
第一个命令将创建一个新文件,并将文本插入其中。第二个命令向文件底部添加一行文本。cat命令将文件内容显示到终端窗口。
当然,我们可以包括变量以将一些有用的信息添加到我们的文件中。如果文件是日志文件,我们可能需要向其添加时间戳。我们可以使用下一个命令做到这一点。
请注意DATE命令的参数两边的单引号。它们防止参数之间的空格被解释为参数列表的末尾。它们确保参数正确传递到日期。
echo "Logfile started: $(date +'%D %T')" > logfile.txt
cat logfile.txt
我们的日志文件是为我们创建的,CAT向我们显示日期戳和时间戳都已添加到其中。
相关:Linux上的stdin、stdout和stderr是什么?
那是Echo的曲目
一条简单的命令,但却是不可或缺的。如果它不存在,我们就得发明它。
毕竟,宙斯的恶作剧做了一些好事。