Shell
Shell
脚本中用
#
表示注释,相当于
C
语言的
//
注释。但如果
#
位于第一行开头,并且是
#!
则例外,它表示该脚本使用后面指定的解释器/bin/sh
解释执行。如果把这个脚本文件加上可执行权限然 后执行
Shell
语法
数据类型只有字符串
Shell 变量名通常是以
字母或下划线打头的字母、数字和下划线字符序列,并且大小写字母意义不同
。
有两种类型的
Shell
变量:环境变量和临时变量
环境变量
环境变量可以从父进程传给子进程,因此
Shell
进程的环境变量可以从当前
Shell
进程传给
fork
出来的子进 程。
用printenv
命令可以显示当前
Shell
进程的环境变量。
10.2.2
临时变量
只存在于当前
Shell
进程,用
set
命令可以显示当前
Shell
进程中定义的所有变量
(
包括临时变量和环境变量)
和函数。
环境变量是任何进程都有的概念,而临时变量是
Shell
特有的概念。在
Shell
中,环境变量和临时变量的定义和用法相似。
文件名代换
*
:匹配
0
个或多个任意字符
?
:匹配一个任意字符
[
若干字符
]
: 匹配方括号中任意一个字符的次出现一次的文件名
命令代换
由
反引号括起来的也是一条命令,
Shell
先执行该命令,然后将输出结果立刻代换到当前命令行中。
算数代换
使用
$(())
,用于算术计算,
(())
中的
Shell
变量取值将转换成整数,同样含义的
$[ ]
等价
转义字符
和
C
语言类似,
\
在
Shell
中被用作转义字符,用于去除紧跟其后的单个字符的特殊意义
(
回车除外
)
,换句话说,紧跟其后的字符取字面值。
单引号
Shell
脚本中的单引号和双引号一样都是字符串的界定符,而不是字符的界定符。单引号用于保持引号内 所有字符的字面值,即使引号内的\
和回车也不例外,但是字符串中不能出现单引号。如果引号没有配对 就输入回车,Shell
会给出续行提示符,要求用户把引号配上对。
双引号
被双引号括住的内容,将被视为单一字串。它防止通配符扩展,但允许变量扩展。单引号不能展开变量。
脚本语法
条件测试
命令
test
或
[
可以测试一个条件是否成立,如果测试结果为真,则该命令的
Exit Status
为
0
,如果测试结 果为假,则命令的Exit Status
为
1
。
分支
if/then/elif/fi
和
C
语言类似,在
Shell
中用
if
、
then
、
elif
、
else
、
fi
这几条命令实现分支控制。这种流程控制语句本质上也是由若干条Shell
命令组成的,例如
echo "Is it morning? Please answer yes or no. "
read YES_OR_NO
if [ "$YES_OR_NO" = "yes" ]; then
echo "Good morning!"
elif [ "$YES_OR_NO" = "no" ]; then
echo "Good afternoon!"
else
echo "Sorry, $YES_OR_NO not recognized. Enter yes or no."
return ;
fi
case/esac
case
命令可类比
C
语言的
switch/case
语句,
esac
表示
case
语句块的结束。
C
语言的
case
只能匹配整型或字符型常量表达式,而Shell
脚本的
case
可以匹配字符串和
Wildcard
,
每个匹配分支可以有若干条命令,
末尾必须以
;;
结束
,执行时找到第一个匹配的分支并执行相应的命令,然后直接跳到
esac
之后,不需要 像C
语言一样用
break
跳出