shell的语法
变量
在shell里,使用变量之前通常并不需要实现为他们做出声明。默认情况下,所以变量都被看做字符串来存储,即使它们被赋值为数值也是如此。shell和一些工具程序会在需要时把数值型字符串转换为对应的数值以对它们进行操作。linux大小写敏感。
在shell中,我们可以通过在变量名前加一个$符号来访问它的内容。无论何时想获取变量的内容,我们都需要在它前面加上一个$字符。当为变量赋值时,我们只需要使用变量名。
如果字符串里包含空格,就必须用引号把他们括起来。还要注意在等号两边不能有空格。
我们可以通过使用read命令将用户的输入赋值给一个变量。这个命令需要一个参数,即准备读入用户的数据的变量名,然后它会等待用户输入数据。通常情况下,用户按下回车键时,read命令结束。
1,使用引号
如果在一个参数中包含一个或多个空白符(例如,空格,制表符或者换行符),就必须给参上加上引号。像$myvar这样的变量在引号中的行为取决于你所使用的引号类型。如果你把一个带有$字符的变量放在双引号中,程序执行到这一行就会把变量替换为它的值;如果你把它放在单引号中,就不会发生替换现象。还可以通过在$字符前机上一个字符取消它的特殊含义。
字符串通常放在双引号中,以防止他们被空白符分开。
#! /bin/bash
myvar="Hi there"
echo $myvar
echo "$myvar"
echo '$myvar'
echo $myvar
echo Enter some text
read myvar
echo '$myvar' now equals $myvar
exit 0
输出结果:
Hi there
Hi there
$myvar
$myvar
Enter some text
HelloWorld
$myvar now equals Hello World
2. 环境变量
当一个shell脚本程序开始运行时,一些变量会根据环境设置中的值进行初始化。这些变量通常用大写字母做名字,以便区分用户在脚本程序里定义的变量,后者按惯例用小写字母做名字。
3. 参数变量
$1,$2… 脚本程序的参数
$* 在一个列表中列出所有的参数,各个参数之间用环境变量IFS的第一个字符分隔开
$@ 它是$*的一种精巧的变换,不使用IFS,使用当IFS为空时,参数的值也不会结合在一起。
可以通过下面这个例子看出$*和$@的区别
实验:参数和环境变量
脚本程序:
#! /bin/sh
salutation="Hello"
echo $salutation
echo "The program $0 is nowrunning"
echo "The second parameter was$2"
echo "The first parameter was $1"
echo "The parameter list was $*"
echo "The user's home directory is$HOME"
echo "Please enter a newgreeting"
read salutation
echo $salutation
echo "The script is now complete"
exit 0
输出结果:
Hello
The program ./hird is now running
The second parameter was
The first parameter was
The parameter list was
The user's home directory is /home/chen123
Please enter a new greeting
SIre
SIre
The script is now complete
条件
test或[命令
为增强可读性,当使用[时,我们还是用符号]来结尾。
以一个最简单的条件为例来介绍test命令的用法:检查一个文件是否存在。用于实现这一操作的命令是test –f <filename>,所以在脚本程序里我们写出如下的代码:
if test –f fred.c
then
…
fi
或用[可以写成如下:
if [ -f fred.c ]
the
…
fi
注意必修在[符号和被检查的条件之间留出空格。
test命令可以使用的条件类型可以归为三类:字符串比较、算术比较和与文件有关的条件测试。
举例:
#! /bin/sh
if [ -f /bin/bash ]
then
echo "file /bin/bash exits"
fi
if [ -d /bin/bash ]
then
echo "/bin/bash is a directory"
else
echo "/bin/bash is NOT a directory"
fi
输出:
file /bin/bash exits
/bin/bash is NOT a directory
控制结构
if语句:
if condition
then
statements
else
statements
fi
elif语句
if condition
then
statements
elif condition
statements
else
statements
fi
for语句
for variable in values
do
statements
done
实验:使用固定字符串的for循环
for variable in values
do
statements
done
输出:
bar
fud
43
实验:使用通配符扩展的for循环
这个例子演示了$(command)用法。for命令的参数表来自括在$()中的命令的输出结果。
while语句
while condition do
statements
done
until语句
until condition
do
statement
done
case语句
case variable in
pattern[ | pattern]…) statements;;
pattern[ | pattern]…) statements;;
esac
命令列表
AND列表
statement && statement2 && statements && …
OR列表
statement || statement || statement || …
语句块
如果想在某些只允许使用单个语句的地方使用多条语句,可以把它们括在括号{}中构造一个语句块。