shell脚本系列:2、shell语法
文章目录
- 3. 注释
shell的基础操作 | ||
• Quoting | 如何去掉字符的特殊含义 | |
• Comments | 如何指定注释 |
当shell读取输入时,它将进行一系列操作。如果输入指示注释的开始,shell将忽略注释符号(#)和该行的其余部分。
否则,粗略地说,shell读取其输入,并将输入划分为单词和操作符,使用引号规则选择为各种单词和字符分配的含义。
shell然后将这些标记解析为命令和其他结构,删除某些单词或字符的特殊含义,展开其他单词或字符,根据需要重定向输入和输出,执行指定的命令,等待命令的退出状态,并使退出状态可用于进一步检查或处理。
1. shell操作
下面是shell读取和执行命令时的操作的简要描述。基本上,shell执行以下操作:
- 从文件(请参见Shell Scripts)、作为参数提供给-c调用选项的字符串(请参见调用Bash)或从用户终端读取输入。
- 将输入分解为单词和操作符,遵守Quoting中描述的引用规则。这些标记由元字符分隔。此步骤执行别名扩展(请参见别名)。
- 将令牌解析为简单和复合命令(请参阅Shell命令)。
- 执行各种shell扩展(请参阅shell扩展),将扩展的令牌分解为文件名列表(请参阅文件名扩展)以及命令和参数。
- 执行任何必要的重定向(请参阅重定向),并从参数列表中删除重定向操作符及其操作数。
- 执行命令(请参见执行命令)。
- 可选地等待命令完成并收集其退出状态(参见退出状态)。
2. 引用
如何去掉单个字符的特殊含义。 | ||
• Single Quotes | 如何禁止对一个字符序列的所有解释。 | |
• Double Quotes | 如何抑制大部分字符序列的解释。 | |
• ANSI-C Quoting | 如何在带引号的字符串中展开ANSI-C序列。 | |
如何将字符串翻译成不同的语言。 |
引号用于删除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标准指定的字符。反斜杠转义序列,如果存在,解码如下:
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。