阅读 PX4代码时会涉及到NuttX系统的语言解释器Shell,这里的Shell应该采用的是bash,因此整理一下bash的基本语法。
1. 最简单的例子——Hello World
#!/bin/bash
# This is a very simple example
echo Hello World
"#!" 及后面的 "/bin/bash" 就表明该文件是一个 BASH 程序,需要由bash程序来解释执行。 echo 语句的功能是把 echo 后面的字符串输出到标准输出中去,需要注意的是 BASH 中的绝大多数语句结尾处都没有分号。
2. Bash中对变量的规定
BASH 中的变量都是不能含有保留字,不能含有 "-" 等保留字符,也不能含有空格。
在 BASH 中变量定义是不需要的,没有 "int i" 这样的定义过程。如果想用一个变量,只要他没有在前面被定义过,就直接可以用,当然你使用该变量的第一条语句应该是对他赋初值了,如果你不赋初值也没关系,只不过该变量是空( 注意:是 NULL,不是 0 )。我们看看下面的例子:
#!/bin/bash
# give the initialize value to STR
STR="Hello World"
echo $STR
在上面这个程序中我们需要注意下面几点:变量赋值时,'='左右两边都不能有空格;BASH 中的语句结尾不需要分号(";");除了在变量赋值和在FOR循环语句头中,BASH 中的变量使用必须在变量前加"$"符号;由于 BASH 程序是在一个新的进程中运行的,所以该程序中的变量定义和赋值不会改变其他进程或原始 Shell 中同名变量的值,也不会影响他们的运行。
更为标准的变量引用方式是 ${STR} 这样的,$STR 自不过是对 ${STR} 的一种简化。在复杂情况下(即有可能产生歧义的地方)最好用带 {} 的表示方式。
BASH 中的变量既然不需要定义,也就没有类型一说,一个变量即可以被定义为一个字符串,也可以被再定义为整数。如果对该变量进行整数运算,他就被解释为整数;如果对他进行字符串操作,他就被看作为一个字符串。
关于整数变量计算,有如下几种:" + - * / % ",他们的意思和字面意思相同。整数运算一般通过 let 和 expr 这两个指令来实现,如对变量 x 加 1 可以写作:let "x = $x + 1" 或者 x=`expr $x + 1` 。
在比较操作上,整数变量和字符串变量各不相同,详见下表:
bash中用于判断文件属性的操作符:
3. Bash中基本流程控制语法
3.1 if语句
if [ expression ]
then
statments
else if [ expression ]
then
statments
else
statments
fi
else if可以用eif代替,如果在if一行中使用then,需要采用
if [ expression ]; then
3.2 for循环
for $var in
do
statments
done
for所在那行的变量可以不加 "$" 符号的,而在循环体内是必须加上 "$" 符号的。
3.3 while
while [ condition ]
do
statments
done
3.4 until
until [ condition is TRUE ]
do
statments
done
3.5 case
case "$var" in
condition1 )
statments1;;
condition2 )
statments2;;
...
* )
default statments;;
esac
3.6 break/continue
BASH 中同样有 break 语句和 continue 语句,作用和用法也和 C 语言中相同。4. 保留字
4.1 保留变量
$IFS 这个变量中保存了用于分割输入参数的分割字符,默认识空格。
$HOME 这个变量中存储了当前用户的根目录路径。
$PATH 这个变量中存储了当前 Shell 的默认路径字符串。
$PS1 表示第一个系统提示符。
$PS2 表示的二个系统提示符。
$PWD 表示当前工作路径。
$EDITOR 表示系统的默认编辑器名称。
$BASH 表示当前 Shell 的路径字符串。
$0, $1, $2, ... 表示系统传给脚本程序或脚本程序传给函数的第0个、第一个、第二个等参数。
$# 表示脚本程序的命令参数个数或函数的参数个数。
$$ 表示该脚本程序的进程号,常用于生成文件名唯一的临时文件。
$? 表示脚本程序或函数的返回状态值,正常为 0,否则为非零的错误号。
$* 表示所有的脚本参数或函数参数。
$@ 和 $* 涵义相似,但是比 $* 更安全。
$! 表示最近一个在后台运行的进程的进程号。
4.2 变量的特殊操作
${var-default} 表示如果变量 $var 还没有设置,则保持 $var 没有设置的状态,并返回后面的默认值 default。
${var=default} 表示如果变量 $var 还没有设置,则取后面的默认值 default。
${var+otherwise} 表示如果变量 $var 已经设置,则返回 otherwise 的值,否则返回空( null )。
${var?err_msg} 表示如果变量 $var 已经设置,则返回该变量的值,否则将后面的 err_msg 输出到标准错误输出上。
还有下面一些用法,这些用法主要用于从文件路径字符串中提取有用信息:
${var#pattern}, ${var##pattern} 用于从变量 $var 中剥去最短(最长)的和 pattern 相匹配的最左侧的串。
${var%pattern}, ${var%%pattern} 用于从变量 $var 中剥去最短(最长)的和 pattern 相匹配的最右侧的串。
另外 BASH 2 中还加入下面一些操作:
${var:pos} 表示去掉变量 $var 中前 pos 个字符。
${var:pos:len} 表示变量 $var 中去掉前 pos 个字符后的剩余字符串的前 len 个字符。
${var/pattern/replacement} 表示将变量 $var 中第一个出现的 pattern 模式替换为 replacement 字符串。
${var//pattern/replacement} 表示将变量 $var 中出现的所有 pattern 模式全部都替换为 replacment 字符串。
4.3 特殊符号
# —— 注释,行首以 #(#!是个例外)开头的是注释。
分号(;)——可以在同一行上写两个或两个以上的命令。
双分号(;;)——可以终止case选项。
双引号(")——阻止(解释)STRING中大部分特殊的字符。
单引号(')—— 将会阻止STRING中所有特殊字符的解释,这是一种比使用"更强烈的形式。
斜线(/)—— 文件名路径分隔符,分隔文件名不同的部分(如/home/bozo/projects/Makefile),也可以用来作为除法算术操作符。
反斜线(\)—— 一种对单字符的引用机制。\X 将会“转义”字符X。
冒号(:)—— 等价于“NOP”(no op,一个什么也不干的命令),也可以被认为与shell的内建命令true作用相同;。还可以在 if/then 中作占位符。
美元符号($)—— 作为变量的前导符,用作变量替换,即引用一个变量的内容。