shell中echo命令的使用
2015-10-28 11:33
381 查看
• echo - 显示一行文本
通过展开,输入的字符在 shell对它起作用之前,会展开成为别的字符。echo 是一个 shell 内部命令,来完成非常简单的任务。
它在标准输出中打印出它的文本参数:
这个命令的作用:传递到 echo 命令的任一个参数都会在(屏幕上)显示出来。
另一个例子:
为什么 echo 不打印“*”呢?
这个”*“字符意味着匹配文件名中的任意字符,所以答案就是:
在 echo 命令被执行 前,shell 把”*“展开成了另外的东西(在这种情况下,就是在当前工作目录下的文件名字)。
当回车键被按下时,shell 在命令被执行前在命令行上自动展开任何符合条件的字符, 所以 echo 命令从不会发现”*“,只把它展开成结果。
我们能够执行以下参数展开模式:
和:
甚至是:
查看home目录之外的目录:
像这样的展开不会显示隐藏文件。
展开模式以一个圆点开头,我们就能够在展开模式中包含隐藏文件,而且隐藏文件可能会出现在第一位置
我们会看到名字”.” 和”..”也出现在结果中。因为这些名字是指当前工作目录和它的父目录,使用这种模式可能会产生不正确的结果。
以下:
这种模式展开成为文件名,每个文件名以圆点开头,第二个字符不包含圆点,再包含至少一个字符, 并且这个字符之后紧接着任意多个字符。
这将列出大多数的隐藏文件 (但仍将不能包含以多个圆点开头的文件名)这个带有 -A 选项(“几乎所有”)的 ls 命令能够提供一份正确的隐藏文件清单:
如果有用户”foo”这个帐号,然后:
例子:
(以上括号中的)表达式是指算术表达式,它由数值和算术操作符组成。
算术表达式只支持整数(全部是数字,不带小数点),但是能执行很多不同的操作。这里是一些它支持的操作符:
在算术表达式中空格并不重要,并且表达式可以嵌套。例如,5的平方乘以3:
一对括号可以用来把多个子表达式括起来。
通过这个技术,我们可以重写上面的例子, 同时用一个展开代替两个,来得到一样的结果:
这是一个使用除法和取余操作符的例子。注意整数除法的结果:
花括号展开模式的开头部分叫做报头,一个结尾部分叫做附言。
花括号表达式本身可能包含一个由逗号分开的字符串列表,或者一系列整数,或者单个的字符串。
这种模式不能嵌入空白字符。这个例题使用了一系列整数:
一系列以倒序排列的字母:
花括号展开可以嵌套:
那么这对什么有好处呢?
最普遍的应用是,创建一系列的文件或目录列表:
它的许多性能 和系统存储小块数据,并给每块数据命名的能力有关系。
许多像这样的小块数据, 更适当些应叫做变量,可以方便地检查它们。例如,叫做”USER”的变量包含你的用户名。
例如:
查看有效的变量列表,可以用这个命令:
通过参数展开,如果你拼写错了一个变量名, 展开仍然会进行,只是展成一个空字符串:
要想得到 cp 程序的 输出列表,不必知道它完整的路径名:
这里我们把 which cp 的执行结果作为一个参数传递给 ls 命令。
也可以使用整个管道线 (只展示部分输出):
在这个例子中,管道线的输出结果成为 file 命令的参数列表。
旧版shell 程序中,有另一种语法也支持命令替换,可与刚提到的语法轮换使用。 bash 也支持这种语法。它使用倒引号来代替美元符号和括号:
shell 从 echo 命令的参数列表中,删除多余的空格。
或者:
参数展开把 $1 的值替换为一个空字符串,因为 1 是没有定义的变量。
shell 提供了一种 叫做引用的机制,来有选择地禁止不需要的展开。
双引号
如果你把文本放在双引号中,shell 使用的特殊字符,除了 $,\ (反斜杠),和 `(倒引号)之外, 则失去它们的特殊含义,被当作普通字符来看待。
这意味着单词分割,路径名展开, 波浪线展开,和花括号展开都被禁止,然而参数展开,算术展开,和命令替换 仍然执行。
使用双引号,我们可以处理包含空格的文件名。
比方说我们是不幸的 名为 two words.txt 文件的受害者。如果我们试图在命令行中使用这个 文件,单词分割机制会导致这个文件名被看作两个独自的参数,而不是所期望 的单个参数:
使用双引号,我们可以阻止单词分割,得到期望的结果;进一步,我们甚至可以修复 破损的文件名。
你瞧!现在我们不必一直输入那些讨厌的双引号了。
注意:在双引号中,参数展开,算术表达式展开,和命令替换仍然有效:
单引号
如果需要禁止所有的展开,我们使用单引号。
以下例子是无引用,双引号,和单引号的比较结果:
正如我们所看到的,随着引用程度加强,越来越多的展开被禁止。
转义字符
有时候我们只想引用单个字符。我们可以在字符之前加上一个反斜杠,在这个上下文中叫做转义字符。 经常在双引号中使用转义字符,来有选择地阻止展开:
使用转义字符来消除文件名中一个字符的特殊含义,是很普遍的。
对于 shell 来说,有特殊含义的字符。这些字符包括”$”, “!”, “ “等字符。在文件名 中包含特殊字符,你可以这样做:
为了允许反斜杠字符出现,输入”\“来转义。注意在单引号中,反斜杠失去它的特殊含义,它被看作普通字符。
知识来源:http://billie66.github.io/TLCL/book/zh/chap08.html
展开(字符)
每输入一个命令,然后按下 enter 键,在 bash 执行命令之前,bash 会对输入 的字符完成几个步骤处理,使这个发生的过程叫做(字符)展开。通过展开,输入的字符在 shell对它起作用之前,会展开成为别的字符。echo 是一个 shell 内部命令,来完成非常简单的任务。
它在标准输出中打印出它的文本参数:
[me@linuxbox ~]$ echo this is a test this is a test
这个命令的作用:传递到 echo 命令的任一个参数都会在(屏幕上)显示出来。
另一个例子:
[me@linuxbox ~]$ echo * Desktop Documents ls-output.txt Music Pictures Public Templates Videos
为什么 echo 不打印“*”呢?
这个”*“字符意味着匹配文件名中的任意字符,所以答案就是:
在 echo 命令被执行 前,shell 把”*“展开成了另外的东西(在这种情况下,就是在当前工作目录下的文件名字)。
当回车键被按下时,shell 在命令被执行前在命令行上自动展开任何符合条件的字符, 所以 echo 命令从不会发现”*“,只把它展开成结果。
路径名展开
这种通配符工作机制叫做路径名展开,给出一个home目录,它看起来像这样:[me@linuxbox ~]$ ls Desktop ls-output.txt Pictures Templates ....
我们能够执行以下参数展开模式:
[me@linuxbox ~]$ echo D* Desktop Documents
和:
[me@linuxbox ~]$ echo *s Documents Pictures Templates Videos
甚至是:
[me@linuxbox ~]$ echo [[:upper:]]* Desktop Documents Music Pictures Public Templates Videos
查看home目录之外的目录:
[me@linuxbox ~]$ echo /usr/*/share /usr/kerberos/share /usr/local/share
隐藏文件路径名展开
以圆点字符开头的文件名是隐藏文件,路径名展开也尊重这种行为。echo *
像这样的展开不会显示隐藏文件。
展开模式以一个圆点开头,我们就能够在展开模式中包含隐藏文件,而且隐藏文件可能会出现在第一位置
echo .*
我们会看到名字”.” 和”..”也出现在结果中。因为这些名字是指当前工作目录和它的父目录,使用这种模式可能会产生不正确的结果。
以下:
ls -d .[!.]?*
这种模式展开成为文件名,每个文件名以圆点开头,第二个字符不包含圆点,再包含至少一个字符, 并且这个字符之后紧接着任意多个字符。
这将列出大多数的隐藏文件 (但仍将不能包含以多个圆点开头的文件名)这个带有 -A 选项(“几乎所有”)的 ls 命令能够提供一份正确的隐藏文件清单:
ls -A
波浪线展开
波浪线字符(“~”)有特殊的意思,当它用在 一个单词的开头时,会展开成指定用户的home目录名,如果没有指定用户名,则是当前用户的home目录:[me@linuxbox ~]$ echo ~ /home/me
如果有用户”foo”这个帐号,然后:
[me@linuxbox ~]$ echo ~foo /home/foo
算术表达式展开
shell 允许算术表达式通过展开来执行。算术表达式展开使用这种格式:$((expression))
例子:
[me@linuxbox ~]$ echo $((13 * 15)) 195
(以上括号中的)表达式是指算术表达式,它由数值和算术操作符组成。
算术表达式只支持整数(全部是数字,不带小数点),但是能执行很多不同的操作。这里是一些它支持的操作符:
在算术表达式中空格并不重要,并且表达式可以嵌套。例如,5的平方乘以3:
[me@linuxbox ~]$ echo $(($((5**2)) * 3)) 75
一对括号可以用来把多个子表达式括起来。
通过这个技术,我们可以重写上面的例子, 同时用一个展开代替两个,来得到一样的结果:
[me@linuxbox ~]$ echo $(((5**2) * 3)) 75
这是一个使用除法和取余操作符的例子。注意整数除法的结果:
[me@linuxbox ~]$ echo $((5/2)) 2 [me@linuxbox ~]$ echo $((5%2)) 1
花括号展开
可能最奇怪的展开是花括号展开。通过它,你可以从一个包含花括号的模式中 创建多个文本字符串。这是一个例子:[me@linuxbox ~]$ echo Front-{A,B,C}-Back Front-A-Back Front-B-Back Front-C-Back
花括号展开模式的开头部分叫做报头,一个结尾部分叫做附言。
花括号表达式本身可能包含一个由逗号分开的字符串列表,或者一系列整数,或者单个的字符串。
这种模式不能嵌入空白字符。这个例题使用了一系列整数:
[me@linuxbox ~]$ echo Number_{1..5} Number_1 Number_2 Number_3 Number_4 Number_5
一系列以倒序排列的字母:
[me@linuxbox ~]$ echo {Z..A} Z Y X W V U T S R Q P O N M L K J I H G F E D C B A
花括号展开可以嵌套:
[me@linuxbox ~]$ echo a{A{1,2},B{3,4}}b aA1b aA2b aB3b aB4b
那么这对什么有好处呢?
最普遍的应用是,创建一系列的文件或目录列表:
[me@linuxbox ~]$ mkdir Test [me@linuxbox ~]$ cd Test [me@linuxbox Test]$ mkdir {2007..2009}-0{1..9} {2007..2009}-{10..12} [me@linuxbox Test]$ ls 2007-01 2007-07 2008-01 2008-07 2009-01 2009-07 2007-02 2007-08 2008-02 2008-08 2009-02 2009-08 2007-03 2007-09 2008-03 2008-09 2009-03 2009-09 2007-04 2007-10 2008-04 2008-10 2009-04 2009-10 2007-05 2007-11 2008-05 2008-11 2009-05 2009-11 2007-06 2007-12 2008-06 2008-12 2009-06 2009-12
参数展开
参数展开,这个特性在 shell 脚本中比直接在命令行中更有用。它的许多性能 和系统存储小块数据,并给每块数据命名的能力有关系。
许多像这样的小块数据, 更适当些应叫做变量,可以方便地检查它们。例如,叫做”USER”的变量包含你的用户名。
例如:
[me@linuxbox ~]$ echo $USER me
查看有效的变量列表,可以用这个命令:
[me@linuxbox ~]$ printenv | cat
通过参数展开,如果你拼写错了一个变量名, 展开仍然会进行,只是展成一个空字符串:
[me@linuxbox ~]$ echo $SUER [me@linuxbox ~]$
命令替换
命令替换允许我们把一个命令的输出作为一个展开模式来使用:[me@linuxbox ~]$ echo $(ls) Desktop Documents ls-output.txt Music Pictures Public Templates Videos
要想得到 cp 程序的 输出列表,不必知道它完整的路径名:
[me@linuxbox ~]$ ls -l $(which cp) -rwxr-xr-x 1 root root 71516 2015-10-28 08:58 /bin/cp
这里我们把 which cp 的执行结果作为一个参数传递给 ls 命令。
也可以使用整个管道线 (只展示部分输出):
[me@linuxbox ~]$ file $(ls /usr/bin/* | grep zip) /usr/bin/bunzip2: symbolic link to `bzip2'
在这个例子中,管道线的输出结果成为 file 命令的参数列表。
旧版shell 程序中,有另一种语法也支持命令替换,可与刚提到的语法轮换使用。 bash 也支持这种语法。它使用倒引号来代替美元符号和括号:
[me@linuxbox ~]$ ls -l `which cp` -rwxr-xr-x 1 root root 71516 2007-12-05 08:58 /bin/cp
引用
我们已经知道 shell 有许多方式可以完成展开,现在是时候学习怎样来控制展开了。 以下面例子来说明:[me@linuxbox ~]$ echo this is a test this is a test
shell 从 echo 命令的参数列表中,删除多余的空格。
或者:
[me@linuxbox ~]$ echo The total is $100.00 The total is 00.00
参数展开把 $1 的值替换为一个空字符串,因为 1 是没有定义的变量。
shell 提供了一种 叫做引用的机制,来有选择地禁止不需要的展开。
双引号
如果你把文本放在双引号中,shell 使用的特殊字符,除了 $,\ (反斜杠),和 `(倒引号)之外, 则失去它们的特殊含义,被当作普通字符来看待。
这意味着单词分割,路径名展开, 波浪线展开,和花括号展开都被禁止,然而参数展开,算术展开,和命令替换 仍然执行。
使用双引号,我们可以处理包含空格的文件名。
比方说我们是不幸的 名为 two words.txt 文件的受害者。如果我们试图在命令行中使用这个 文件,单词分割机制会导致这个文件名被看作两个独自的参数,而不是所期望 的单个参数:
[me@linuxbox ~]$ ls -l two words.txt ls: cannot access two: No such file or directory ls: cannot access words.txt: No such file or directory
使用双引号,我们可以阻止单词分割,得到期望的结果;进一步,我们甚至可以修复 破损的文件名。
[me@linuxbox ~]$ ls -l "two words.txt" -rw-rw-r-- 1 me me 18 2008-02-20 13:03 two words.txt [me@linuxbox ~]$ mv "two words.txt" two_words.txt
你瞧!现在我们不必一直输入那些讨厌的双引号了。
注意:在双引号中,参数展开,算术表达式展开,和命令替换仍然有效:
[me@linuxbox ~]$ echo "$USER $((2+2)) $(cal)" me 4 February 2008 Su Mo Tu We Th Fr Sa ....
单引号
如果需要禁止所有的展开,我们使用单引号。
以下例子是无引用,双引号,和单引号的比较结果:
[me@linuxbox ~]$ echo text ~/*.txt {a,b} $(echo foo) $((2+2)) $USER text /home/me/ls-output.txt a b foo 4 me [me@linuxbox ~]$ echo "text ~/*.txt {a,b} $(echo foo) $((2+2)) $USER" text ~/*.txt {a,b} foo 4 me [me@linuxbox ~]$ echo 'text ~/*.txt {a,b} $(echo foo) $((2+2)) $USER' text ~/*.txt {a,b} $(echo foo) $((2+2)) $USER
正如我们所看到的,随着引用程度加强,越来越多的展开被禁止。
转义字符
有时候我们只想引用单个字符。我们可以在字符之前加上一个反斜杠,在这个上下文中叫做转义字符。 经常在双引号中使用转义字符,来有选择地阻止展开:
[me@linuxbox ~]$ echo "The balance for user $USER is: \$5.00" The balance for user me is: $5.00
使用转义字符来消除文件名中一个字符的特殊含义,是很普遍的。
对于 shell 来说,有特殊含义的字符。这些字符包括”$”, “!”, “ “等字符。在文件名 中包含特殊字符,你可以这样做:
[me@linuxbox ~]$ mv bad\&filename good_filename
为了允许反斜杠字符出现,输入”\“来转义。注意在单引号中,反斜杠失去它的特殊含义,它被看作普通字符。
知识来源:http://billie66.github.io/TLCL/book/zh/chap08.html
相关文章推荐
- 坏的解释器: 没有那个文件或目录/bin/sh
- Shell脚本:使用rsync备份文件/目录
- Shell脚本:使用rsync备份文件/目录
- Shell脚本:使用rsync备份文件/目录
- Shell脚本处理“integer expression expected”
- Checking System Drive Free Space with WMI and PowerShell
- Git下部署项目的shell脚本
- shell 判断文件、目录是否存在
- Delphi中ShellExecute使用详解(详细解释10种显示状态)
- shell for读取文件换行问题
- linux shell 编程2 if then else fi 字符串空的判断
- Linux shell流程控制
- Linux shell按行读文件
- Jmeter之Bean shell使用(一)
- 初学shell,今天遇到由wget下载到本地的网页源代码的乱码问题,无聊的写了一个转码的脚本
- 【shell文字】mysql每日备份shell文字
- SSH Secure Shell Client远程连接到虚拟机的UBUNTU系统
- shell脚本中的[]/[[]]区别
- Eclipse 安装 EasyShell 插件(打开项目所在本地磁盘位置)
- 使用Xshell连接到Linux