shell脚本系列:2、shell语法

shell脚本系列:2、shell语法


Shell Operationshell的基础操作
Quoting如何去掉字符的特殊含义
Comments如何指定注释

当shell读取输入时,它将进行一系列操作。如果输入指示注释的开始,shell将忽略注释符号(#)和该行的其余部分。

否则,粗略地说,shell读取其输入,并将输入划分为单词和操作符,使用引号规则选择为各种单词和字符分配的含义。

shell然后将这些标记解析为命令和其他结构,删除某些单词或字符的特殊含义,展开其他单词或字符,根据需要重定向输入和输出,执行指定的命令,等待命令的退出状态,并使退出状态可用于进一步检查或处理。

1. shell操作

下面是shell读取和执行命令时的操作的简要描述。基本上,shell执行以下操作:

  1. 从文件(请参见Shell Scripts)、作为参数提供给-c调用选项的字符串(请参见调用Bash)或从用户终端读取输入。
  2. 将输入分解为单词和操作符,遵守Quoting中描述的引用规则。这些标记由元字符分隔。此步骤执行别名扩展(请参见别名)。
  3. 将令牌解析为简单和复合命令(请参阅Shell命令)。
  4. 执行各种shell扩展(请参阅shell扩展),将扩展的令牌分解为文件名列表(请参阅文件名扩展)以及命令和参数。
  5. 执行任何必要的重定向(请参阅重定向),并从参数列表中删除重定向操作符及其操作数。
  6. 执行命令(请参见执行命令)。
  7. 可选地等待命令完成并收集其退出状态(参见退出状态)。

2. 引用

Escape Character如何去掉单个字符的特殊含义。
Single Quotes如何禁止对一个字符序列的所有解释。
Double Quotes如何抑制大部分字符序列的解释。
ANSI-C Quoting如何在带引号的字符串中展开ANSI-C序列。
Locale Translation如何将字符串翻译成不同的语言。

引号用于删除shell中某些字符或单词的特殊含义。可以使用引号禁用对特殊字符的特殊处理,防止保留字被识别为此类字符,并防止参数膨胀。

每个shell元字符(参见定义)对shell都有特殊的含义,如果要表示它自己,必须用引号括起来。当使用命令历史扩展工具时(参见历史交互),历史扩展字符,通常是’ !’,必须被引用,以防止history扩展。有关history扩展的更多详细信息,请参见Bash history工具

有三种引用机制:转义字符、单引号和双引号。

2.1 转义字符

非引号反斜杠’ \ '是Bash转义字符。除了换行符外,它保留后面一个字符的文字值。如果出现\换行符对,并且反斜杠本身没有加引号,则\换行符将被视为续行符(也就是说,它将从输入流中删除,实际上被忽略)。

2.2 单引号

括在单引号中的字符(’’’)保留了引号内每个字符的文字值。单引号不能出现在单引号之间,即使前有反斜杠。

2.3 双引号

双引号(’"’)中包含的字符保留引号内所有字符的文字值,除了’KaTeX parse error: Expected 'EOF', got '#' at position 120: …sh/bashref.html#̲Bash-POSIX-Mode…‘和'`'在双引号中保留其特殊含义(参见Shell expansion)。只有当后跟:’$’、'`'、’"’、’\‘或换行符时,反斜杠才有其特殊含义。在双引号中,后跟这些字符之一的反斜杠将被删除。前面没有特殊含义的反斜杠不作修改。双引号可以在双引号中加上反斜杠。如果启用,history扩展将执行,除非’!‘出现在双引号中使用反斜杠进行转义。’!'前面的反斜杠并没有被移除。

特殊参数’ * ‘和’ @ '在双引号中有特殊含义(参见Shell参数扩展)。

2.4 ANSI-C引用

对$'string’形式的单词进行特殊处理。单词扩展为字符串,反斜杠转义字符替换为ANSI C标准指定的字符。反斜杠转义序列,如果存在,解码如下:

\a:警告(蜂鸣)
\b:退格
\e:
\E:转义字符(非ANSI C)
\f:换页符
\n:换行符
\r:回车符
\t:水平制表符
\v:垂直制表符
\\:反斜杠
\':单引号
\":双引号
\?:问好
\nnn:8位字符,其值为八进制值NNN(1到3个八进制数字)。
\xHH:8位字符,其值为十六进制值HH(一个或两个十六进制数字)。
\uHHHH:十六进制值HHHH(1到4位十六进制数字)的Unicode (ISO/IEC 10646)字符
\UHHHHHHHH:十六进制值HHHHHHHH(1到8位十六进制数字)的Unicode (ISO/IEC 10646)字符。
\cx:control-x字符

2.5 特定区域的翻译

前面有一个美元符号(’ $ ')的双引号字符串将导致字符串根据当前区域设置进行翻译。gettext基础结构使用LC_MESSAGES和TEXTDOMAIN shell变量执行消息目录查找和翻译,如下所示。有关更多细节,请参阅gettext文档。如果当前区域设置是C或POSIX,或者没有可用的翻译,则忽略美元符号。如果转换并替换了字符串,则将使用双引号进行替换。

一些系统使用LC_MESSAGES 作为shell变量选择的消息目录。其他的则根据TEXTDOMAIN 作为shell变量的值创建消息目录的名称,可能会添加’ .mo '后缀。如果使用TEXTDOMAIN变量,则可能需要将TEXTDOMAINDIR变量设置为消息目录文件的位置。还有一些人以这种方式使用两个变量:TEXTDOMAINDIR/LC_MESSAGES/LC_MESSAGES/TEXTDOMAIN.mo。

3. 注释

在非交互式shell中,或者在启用了shopt内置的interactive_comments选项的交互式shell中(请参阅shopt内置),以“#”开头的单词将导致忽略该行上的单词和所有剩余字符。没有启用interactive_comments选项的交互式shell不允许注释。交互式shell中的interactive_comments选项默认是打开的。有关使shell具有交互性的描述,请参见交互式shell

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

昵称系统有问题

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值