shell脚本系列:2、shell语法


文章目录

• ​​Shell Operation​

shell的基础操作

• ​​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​​。