shell脚本的格式
#!/bin/bash //脚本声明(#!)用来告诉系统使用哪种Shell解释器来执行该脚本
# an example of shell script //注释信息(#)是对脚本功能和某些命令的介绍信息
pwd //可执行语句也就是我们平时执行的Linux命令
ls -al
- 脚本声明
#!
用来告诉系统使用哪种Shell解释器来执行该脚本 - 只要
Shell
碰到了特殊字符#
,就会忽略#
之后,直到行尾的所有字符。如果#
出现在行首,那么这一整行都被视为注释。 - linux的指令
变量
像所有其他编程语言一样,Shell
允许你将值保存在变量中。变量名以字母
或下划线(_)
开头,后面可以跟上零个或多个字母及数字字符或下划线。
要将值保存在变量中,要先写出变量名,然后紧跟上等号=,接着是要存入变量的值:
variable=value
举例来说,要将值1分配给变量count,只需要写作:
count=1
要将值/users/steve/bin 分配给Shell
变量 my_bin,可以写作:
my_bin=/users/steve/bin
这里有几处重要的地方:
- 等号两边不能有空格。
Shell
并没有数据类型的概念。无论你给Shell
变量分配什么样的值,Shell
都简单地将其视为字符串。
对于那些所包含的字符串同时也是合法数字的Shell
变量而言,Shell
可以通过特殊的内建操作来支持整数运算,即便如此,也会继续对变量求值,以确保的确是有效的数字。
显示变量值
echo 命令(我们曾用它打印从标准输入中获得的字符串)可以用来显示Shell
变量的值。
echo $variable
字符$
的后面如果跟的是一个或多个字母及数字字符,那么对于Shell
而言,$
就是一个特殊字符。如果变量名出现在$
之后,Shell
会认为这时应该使用变量中保存的值进行替换。
Shell 是在执行命令前进行变量替换的。
未定义变量的值为空
没有值的变量叫做未定义变量,其值为空(null)。这是没有赋过值的变量的默认状态。当 Shell 执行变量替换时,为空的值会被从命令行中删除。
有时你也许想将某个变量的值初始化为空值。这时只需要把等号右侧留空就行了,例如:
dataflag=
还有另一种更好的方法,你可以在=
之后使用两个连续的引号:
dataflag=""
以及
dataflag=''
两种写法的效果一样,都可以将空值赋给 dataflag,而且看起来意图明显,不像第一个例子中那样让人觉得是不小心写错了。
注意,下面的赋值:
dataflag=" "
并不等同于上面3个赋值语句,它是将一个空格字符赋给了dataflag,这和空字符可不是一回事。
文件名替换与变量
如果你输入:
x=*
echo $x
文件列表究竟是在执行x=*
时被保存在了变量x中,还是由Shell
在执行echo $x
时完成了替换操作?
答案就是:在对变量赋值时,Shell
并不执行文件名替换。因此x=*
就是将字符*
赋给了变量x
。依据上面看到的输出结果,这就意味着 Shell
必须在执行echo命令
时完成文件名替换。
严格的操作步骤如下所示:
Shell
扫描命令行,将x
替换成*
Shell
重新扫描命令行,遇到*
后,使用当前目录下的所有文件名来替换Shell
执行echo
,将文件列表作为参数传入
记住,
Shell
先进行变量替换,然后是文件名替换,接着是将命令行解析成参数。
${variable}
结构
假设你有一个文件名保存在变量filename中。如果你想给文件更名,新文件名的构成采用旧文件名加上字符X的形式,你的第一反应可能会是:
mv $filename $filenameX
当Shell
扫描命令行时,会将变量filename和filenameX替换成对应的值Shell
。认为filenameX是一个完整的变量名,因为该名称中都是合法的字符。要想避免这种情况,可以将整个的变量名放进花括号里,也就是这样:
${filename}X
这样就避免了歧义,mv
命令也就能够获得预想的结果了:
mv $filename ${filename}X
记住,只有在变量名的最后一个字符后面跟的是字母及数字字符或下划线的时候才有必要使用花括号。在花括号写法中,还有不少其他的功能,其中包括:
- 提取子集
- 给未赋值的变量赋值
内建的整数算术操作
所有的现代UNIX以及Linux变种(包括 Mac OSX 的命令 Shell)中所包含的POSIX标准Shell
提供了一种叫做算术扩展的机制,能够用于执行Shell
变量的整数运算。注意,有些比较旧的 Shell 并不支持该特性。
算术扩展的格式为:
$((expression))
expression
是包含Shell
变量和操作符的算术表达式。有效的Shell
变量必须包含数字值。有效的操作符和C语言
中的一样。
$(())
中可用的操作符其中包括基本的6种:+、-、*、/、%和**
,另外还有一些比较复杂的记法:+=、-=、*、=、/=,以及自增variable++和自减variable--
等。
例如:
echo $((i+1))
将Shell
变量i加1,然后打印出结果。注意,变量i前面的$
不是必需的,因为Shell
知道能够出现在算术扩展中的有效元素只有操作符
、数字
和变量
。
如果变量未定义或包含空串,其值被视为0。因此,就算是我们没给变量a赋值,它依然可以出现在整数表达式中:
echo $(( a = a + 1 )) 等同于 a = 0 + 1
如果你在赋值的时候不想使用echo
或其他命令,可以把赋值操作符放在算术扩展之前。
i=$(( i * 5 ))
注意,双括号内部的空格是可选的,但是在外部进行赋值的时候不能有空格。
$i
乘以5的另一种更紧凑的写法如下,它可以出现在另一个语句中:
$(( i *= 5 ))
如果你只是要给变量值加1,这样写更简洁:
$(( i++ ))