文章目录

  • ​​1 echo——显示一行文本​​
  • ​​2 (字符)展开​​
  • ​​1)echo 是一个 shell 内部命令,它在标准输出中打印出它的文本参数。​​
  • ​​2)传递到 echo 命令的任一个参数都会在(屏幕上)显示出来。​​
  • ​​3.路径名展开​​
  • ​​补充:隐藏文件路径名的展开:echo .*,ls -d .* | less​​
  • ​​4.按照波浪线展开:echo ~foo​​
  • ​​5.算术表达式展开:$((expression))​​
  • ​​6.花括号展开:echo Front-{A,B,C}-Back​​
  • ​​7.参数展开:echo $USER​​
  • ​​8.命令替换:echo $(ls)​​
  • ​​9.引用​​
  • ​​10.双引号:引用的第1种类型​​
  • ​​11.单引号:引用的第2种类型-禁止所有的展开​​
  • ​​12.转义字符:反斜杠\​​

1 echo——显示一行文本

2 (字符)展开

1)echo 是一个 shell 内部命令,它在标准输出中打印出它的文本参数。

2)传递到 echo 命令的任一个参数都会在(屏幕上)显示出来。

[me@linuxbox ~]$ echo this is a test
this is a test

这个 “*” 字符意味着匹配文件名中的任意字符,就是在当前工作目录下的文件名字

[me@linuxbox ~]$ echo *
Desktop Documents ls-output.txt Music Pictures Public Templates Videos

3.路径名展开

给出一个主目录,它看起来像这样:

[me@linuxbox ~]$ ls
Desktop ls-output.txt Pictures Templates

试着用参数展开:

[me@linuxbox ~]$ echo D*
Desktop Documents
[me@linuxbox ~]$ echo *s
Documents Pictures Templates Videos

以及
注:通配符:[[:upper:]]* 以大写字母开头的文件

[me@linuxbox ~]$ echo [[:upper:]]*
Desktop Documents Music Pictures Public Templates Videos

查看主目录之外的目录:

[me@linuxbox ~]$ echo /usr/*/share
/usr/kerberos/share /usr/local/share

补充:隐藏文件路径名的展开:echo .,ls -d . | less

以圆点字符开头的文件名是隐藏文件

1)echo *
不会显示隐藏文件;
echo .*
要是展开模式以一个圆点开头,我们就能够在展开模式中包含隐藏文件,而且隐藏文件可能会出现在第一位置,但是名字“.” 和 “…” 也出现在结果中。因为这些名字是指当前工作目录和它的父目录,使用这种模式可能会产生不正确的结果。

2)ls -d .* | less
这种情况下正确地完成路径名展开
|是管道线
-d可以看到目录的详细信息

为了精确一点,用
ls -d .[!.]?*
这种模式展开成为文件名,每个文件名以圆点开头,第二个字符不包含圆点,再包含至少一个字符,并且这个字符之后紧接着任意多个字符。但是不能包含以多个圆点开头的文件名。

3)ls -A
-A 列出所有文件,以及以圆点开头的隐藏文件

4.按照波浪线展开:echo ~foo

波浪线字符 (“∼”) 有特殊的意思:当它用在一个单词的开头时,它会展开成指定用户的主目录名,如果没有指定用户名,则是当前用户的主目录

[me@linuxbox ~]$ echo ~foo
/home/foo

[me@linuxbox ~]$ echo ~
/home/me

5.算术表达式展开:$((expression))

可以将shell提示当作计算器来使用
算术表达式展开使用这种格式:

$((expression))

(以上括号中的)表达式是指算术表达式,它由数值算术操作符组成。
算术表达式只支持整数(全部是数字,不带小数点),但是能执行很多不同的操作。

一些支持的操作符举例如下:

《快乐的Linux命令行》学习记录——第七章从shell眼中看世界_linux


《快乐的Linux命令行》学习记录——第七章从shell眼中看世界_linux_02

[me@linuxbox ~]$ echo $((2 + 2))
4

一对括号可以用来把多个子表达式括起来

[me@linuxbox ~]$ echo $(((5**2) * 3))
75

这个一个使用除法和取余操作符的例子。注意整数除法的结果:

[me@linuxbox ~]$ echo Five divided by two equals 《快乐的Linux命令行》学习记录——第七章从shell眼中看世界_文件名_03 echo with $((5%2)) left over.
with 1 left over.

6.花括号展开:echo Front-{A,B,C}-Back

你可以从一个包含花括号的模式中创建多个文本字符串。

花括号展开模式可能包含一个开头部分叫做报头,一个结尾部分叫做附言
花括号表达式本身可能包含一个由逗号分开的字符串列表,或者一系列整数,或者单个的字符串。
这种模式可能不包括嵌入的空白。

[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 Pics
[me@linuxbox ~]$ cd Pics
[me@linuxbox Pics]$ mkdir {2007…2009}-0{1…9} {2007…2009}-{10…12}
[me@linuxbox Pics]$ 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

7.参数展开:echo $USER

这个特性在 shell 脚本中比直接在命令行中更有用,它的许多性能和系统存储小块数据,并给每块数据命名的能力有关系。许多像这样的小块数据,更适当些应叫做变量,可以方便地检查它们。

例如,叫做 “USER” 的变量包含你的用户名。唤醒参数展开,揭示 USER 中的内容,可以这样做:

[me@linuxbox ~]$ echo $USER
me

查看有效的变量列表

[me@linuxbox ~]$ printenv | less

如果你误输入一个模式,展开就不会发生。这时 echo 命令只简单地显示误键入的模式。通过参数展开,如果你拼写错了一个变量名,展开仍然会进行,只是展成一个空字符串:

[me@linuxbox ~]$ echo 《快乐的Linux命令行》学习记录——第七章从shell眼中看世界_双引号_04

8.命令替换:echo $(ls)

命令替换允许我们把一个命令的输出作为一个展开模式来使用

[me@linuxbox ~]$ echo $(ls)
Desktop Documents ls-output.txt Music Pictures Public Templates
Videos

这里我们把 which cp 的执行结果作为一个参数传递给 ls 命令,因此要想得到 cp 程序的输出列表,不必知道它完整的路径名

[me@linuxbox ~]$ ls -l $(which cp)
-rwxr-xr-x 1 root root 71516 2007-12-05 08:58 /bin/cp

也可以使用整个管道线:
file —确定文件类型,grep -打印匹配行

[me@linuxbox ~]$ file $(ls /usr/bin/* | grep zip)
/usr/bin/bunzip2: symbolic link to `bzip2’

9.引用

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 是没有定义的变量

10.双引号:引用的第1种类型

如果你把文本放在双引号中, 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 this is a 这尼玛是空格(空格打不出来,就写字表示) test
this is a test

如果我们加上双引号:
单词分割被禁止,内嵌的空格也不会被当作界定符,它们成为参数的一部分。一旦加上双
引号,我们的命令行就包含一个带有一个参数的命令

[me@linuxbox ~]$ echo “this is a 这尼玛是空格(空格打不出来,就写字表示) test”
this is a 这尼玛是空格(空格打不出来,就写字表示) test

下面的第一个eg:没有引用的命令替换导致命令行包含 38 个参数
下面的第二个eg:命令行只有一个参数,参数中包括嵌入的空格和换行符

[me@linuxbox ~]$ echo $(cal)
February 2008 Su Mo Tu We Th Fr Sa 1 2 3 4 5 6 7 8 9 10 11 12 13 14
15 16 17 18 19 20 21 22 23 24 25 26 27 28 29

[me@linuxbox ~]$ echo “$(cal)”
February 2008

11.单引号:引用的第2种类型-禁止所有的展开

无引用,双引号,和单引号的比较结果:

[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

12.转义字符:反斜杠\

转义字符:我们可以在字符之前加上一个反斜杠,经常在双引号中使用转义字符,来有选择地阻止展开。
注意在单引号中,反斜杠失去它的特殊含义,它被看作普通字符。

[me@linuxbox ~]$ echo “The balance for user $USER is: $5.00”
The balance for user me is: $5.00

使用转义字符来消除文件名中一个字符的特殊含义,是很普遍的。在文件名中
包含特殊字符,你可以这样做:

[me@linuxbox ~]$ mv bad&filename good_filename

补充:反斜杠转义字符序列

《快乐的Linux命令行》学习记录——第七章从shell眼中看世界_linux_05


《快乐的Linux命令行》学习记录——第七章从shell眼中看世界_双引号_06