shell程序设计教程(2)

发布时间:2020-03-09编辑:脚本学堂
本文介绍了shell程序设计中有关shell语法的相关内容,在shell里,使用变量之前通常并不需要实现为他们做出声明。默认情况下,所以变量都被看做字符串来存储,即使它们被赋值为数值也是如此。

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脚本程序开始运行时,一些变量会根据环境设置中的值进行初始化。这些变量通常用大写字母做名字,以便区分用户在脚本程序里定义的变量,后者按惯例用小写字母做名字。
 

复制代码 代码示例:
#HOME   当前用户的主目录
#PATH 以冒号分隔的用来搜索命令的目录列表
#PS1   命令提示符,通常是$字符,但在bash中,你可以使用一些更复杂的值。
#PS2 二级提示符,用来提示后续的输入,通常是>字符
#IFS  输入域分隔符
$0  SHELL脚本的名字
$#  传递给脚本的参数个数
$$  shell脚本的进程号

3. 参数变量
$1,$2…  脚本程序的参数
$*  在一个列表中列出所有的参数,各个参数之间用环境变量IFS的第一个字符分隔开
$@  它是$*的一种精巧的变换,不使用IFS,使用当IFS为空时,参数的值也不会结合在一起。
可以通过下面这个例子看出$*和$@的区别
 

复制代码 代码示例:
chen123@ubuntu:~/C++$ IFS=''
chen123@ubuntu:~/C++$ set foo bar bam
chen123@ubuntu:~/C++$ echo "$@"
foo bar bam
chen123@ubuntu:~/C++$ echo "$*"
foobarbam
chen123@ubuntu:~/C++$ unset IFS
chen123@ubuntu:~/C++$ echo "$*"
foo bar bam
chen123@ubuntu:~/C++$

实验:参数和环境变量

脚本程序:
 

复制代码 代码示例:

#! /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循环
 

复制代码 代码示例:
#! /bin/sh
for file in $(ls f*.sh);
do
   lpr$file
done
exit 0

这个例子演示了$(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 || …

语句块
如果想在某些只允许使用单个语句的地方使用多条语句,可以把它们括在括号{}中构造一个语句块。