shell展开

字符展开

直接使用echo命令:

[me@linuxbox ~]$ echo this is a test
this is a test
路径名展开

使用通配符来展开(书中原话:这种通配符工作机制叫做路径名展开),对于隐藏文件名的展开,建议使用 ls -a。

波浪线展开

当波浪线(~)用在 一个单词的开头时,它会展开成指定用户的家目录名,如果没有指定用户名,则是当前用户的家目录:

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

如果有用户”foo”这个帐号,然后:

[me@linuxbox ~]$ echo ~foo
/home/foo
算术表达式展开

算术表达式展开使用这种格式:

$((expression))

算术表达式中,加减乘除与常规一致,取余(%)、幂(**)。

花括号展开

可能最奇怪的展开是花括号展开。通过它,你可以从一个包含花括号的模式中创建多个文本字符串。
一个例子:

[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

利用这个特性,我们可以创建一系列规则相同的文件名。

参数展开

这个特性在 shell 脚本中比直接在命令行中更有用。它的许多性能和系统存储小块数据,并给每块数据命名的能力有关系。许多像这样的小块数据, 更适当些应叫做变量,可以方便地检查它们。例如,叫做”USER”的变量包含你的 用户名。唤醒参数展开,揭示 USER 中的内容,可以这样做:

[me@linuxbox ~]$ echo $USER
me

参数展开,如果你拼写错了一个变量名, 展开仍然会进行,只是展成一个空字符串。

命令替换

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

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

这里我们把 which cp 的执行结果作为一个参数传递给 ls 命令,因此要想得到 cp 程序的输出列表,不必知道它完整的路径名。这样我们可以在不知道文件夹路径的情况下直接看到文件夹信息。

双引号引用

如果你把文本放在双引号中, shell 使用的特殊字符,除了$ , \ (反斜杠),和 `(倒引号)之外, 其他字符失去它们的特殊含义,被当作普通字符来看待。这意味着单词分割,路径名展开, 波浪线展开,和花括号展开都被禁止,然而参数展开,算术展开,和命令替换仍然执行。使用双引号,我们可以处理包含空格的文件名。

记住,在双引号中,参数展开,算术表达式展开,和命令替换仍然有效:

[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

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

单引号引用

如果需要禁止所有的展开,我们使用单引号。
以下例子是无引用,双引号,和单引号的比较结果:

[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

使用转义字符来消除文件名中一个字符的特殊含义,是很普遍的。

echo 命令带上 ‘-e’ 选项,能够解释转义序列。你可以把转义序列放在 $’ ’ 里面。 以下例子,使用sleep 命令,一个简单的程序,它会等待指定的秒数,然后退出。 我们可以创建一个简单的倒数计数器:

sleep 10; echo -e "Time's up\a"
我们也可以这样做:
sleep 10; echo "Time's up" /span>\a'

参考:《The Linux Command Line》

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值