shell编程语句,shell脚本基本语法详解
外壳语法
变量:
在Shell中,我们不需要在使用变量之前声明它们。相反,我们可以在需要时简单地使用它们。默认情况下,所有变量都存储为字符串,尽管有时我们用数字给它们赋值。Shell等实用的转换程序会将数值字符串转换成相应的值进行运算。在Linux系统中,变量foo和Foo是不同的。
在Shell中,我们需要访问一个变量的值,并且我们需要在它前面加上一个$。当我们想给一个变量赋值的时候,我们可以只使用变量的名字,Shell会在需要的时候动态地创建它。检测变量内容的一个简单方法是在终端输出,然后在变量前加一个$。
在命令行中,我们可以使用以下方法来设置和检测变量的值:
$ salutation=你好
$ echo $问候语
你好
$ salutation="是的,亲爱的"
$ echo $问候语
是的,亲爱的
$ salutation=7 5
$ echo $问候语
7 5
我们还可以使用read命令将用户的输入分配给变量。这将把变量名作为一个参数,并等待用户的输入。当用户输入enter时,read命令将结束。当从终端读取变量时,我们不需要使用引号。例如:
$已读问候语
怎么回事?
$ echo $问候语
怎么回事?
报价:
在继续学习之前,我们要明确引号的作用。
通常,脚本中的参数由空白字符分隔,如空格、制表符或回车。如果我们希望我们的参数包含一个或多个参数,我们必须使用引号。
例如,变量$foo的行为取决于我们使用的引号的类型。如果我们用双引号,在执行这一行的时候会被它的值代替,但是如果我们用单引号,就不会这样了。我们还可以使用转义符/来删除$的特殊含义
通常我们用双引号来包含字符串,这样可以防止变量被空格字符分隔,会被变量的值代替。
在下面的例子中,我们将看到引号对变量输出的影响:
#!/bin/bash
myvar="你好"
echo $myvar
回显" $myvar "
回显 $myvar
echo /$myvar
回显输入一些文本
读取myvar
echo $myvar 现在等于$myvar
出口0
这个程序的输出是:
你好
你好
$myvar
$myvar
输入一些文本
你好世界
$myvar现在等于Hello World
操作原理
我们创建了修改后的myvar,并将其指定为Hi。变量的内容由命令echo显示,因此我们可以看到$字符扩展对变量内容的影响。从这个输出中,我们可以看到双引号不会影响变量的替换,但是单引号和反斜线会影响。我们还使用read命令从用户那里获取输入。
环境变量
当Shell脚本启动时,一些变量由环境中的值初始化。在脚本中,这些变量通常是大写字母,从而区别于用户定义的变量,而用户定义的变量通常用小写字母表示。创建的变量取决于我们的个人配置。手册页中列出了许多,但下表中列出了一些基本的:
$HOME当前用户的主目录
$PATH用于命令查找的冒号分隔的目录列表
$PS1命令提示符通常是$,但是我们可以在bash中使用更复杂的值。例如,字符串[/u@/h /W]$是一种流行的默认用法,用来告诉我们当前用户、机器名和当前工作目录,并给出一个$提示符。
$PS2第二个提示,通常在提示额外输入时使用
$IFS输入区域分隔符。当Shell读入输入时,它使用一个字符列表来分隔输入的单词,通常是空格、制表符和换行符。
$0 Shell脚本的名称。
$ #传递的参数数。
$ $脚本的进程ID通常在脚本中用于创建唯一的临时文件,例如/tmp/tmp-file_$。
如果我们的脚本调用一些参数,就会创建一些其他变量。即使没有传递任何参数,环境变量$ #仍然存在,但其值为0。
下表列出了这些变量:
$1,$2,传递给脚本的参数。
$ *将所有参数列表显示为单个变量,由环境变量IFS中的第一个字符分隔。
$ @ $ *的巧妙变体。它不使用IFS环境变量,所以如果IFS为空,所有参数将一起运行。
通过下面的测试,我们很容易看出$ @和$ *之间的区别:
$ IFS=
$ set foo bar bam
$ echo "$@ "
foo bar bam
$ echo "$* "
foobarbam
$ unset IFS
$ echo "$* "
foo bar bam
我们可以看到,在双引号中,$ @单独显示参数,而不管IFS的值。一般来说,如果我们想要访问参数,$ @是一个非常敏感的选择。
我们不仅可以用echo命令打印出变量的内容,还可以用read命令读取它们的内容。
和环境变量。
以下脚本显示了简单变量的处理。在我们输入以下脚本内容并将其保存为try_var之后,我们必须记住使用命令chmod x try_var为其添加可执行权限。
#!/bin/sh
salutation="你好"
echo $salutation
回显“程序$0正在运行”
echo "第二个参数是$2 "
echo "第一个参数是$1 "
echo "参数列表为$* "
回显“用户的主目录是$HOME”
回显“请输入新问候语”
阅读问候语
echo $salutation
回显“脚本现已完成”
出口0
如果我们运行这个脚本,我们将得到以下输出:
~$ ./try_var.sh foo bar baz
你好
这个项目。/try_var.sh现在正在运行
第二个参数是bar
第一个参数列表是foo bar baz
用户的主目录是/home/my孝义
请输入新的问候语
你好
脚本现在已经完成
工作原理:
该脚本创建一个名为salutation的变量并显示其空白区域,然后显示各种参数变量,环境变量$HOME已经存在并具有适当的值。
功能:
所有编程语言的基本原理都是测试条件,并在这些测试的基础上执行各种操作。在我们讨论这个主题之前,让我们先来看看我们将在Shell脚本中使用的函数结构和我们将使用的控制结构。
Shell脚本可以测试命令行调用的任何命令的返回代码,包括我们自己编写的脚本。这就是为什么我们在每个Shell脚本的末尾都包含退出代码的重要原因。
或者[命令:
事实上,大多数脚本使用大量的test或[command来检测Shell的真实性。在大多数系统上,[和test command是同义词,但是当使用[command]时,为了可读性,它还在末尾使用了一个]命令。使用[command]似乎有点奇怪,但是这个命令会使命令的语法看起来简单、整洁,与其他编程语言相似。
ls -l /usr/bin/[
-rwxr-xr-x 1根root 25040 2005-11-16 21:17/usr/bin/[
我们将使用一个简单的测试示例来介绍测试命令:检测文件是否存在。用于此目的的命令是test -f filename,因此我们可以使用以下脚本:
if测试f fred.c
然后
.
船方不负担装货费用
我们也可以这样写:
if [ -f fred.c ]
然后
.
船方不负担装货费用
测试命令的返回代码(是否满足条件)取决于条件代码是否运行。
在这里,我们应该注意到,我们必须用一个空格把那个[和条件]分开。我们可以这样记:【是t命令的另一种写法,我们要在test命令后面输入一个空格。
如果我们想把then和If放在同一行,我们必须加一个冒号把它们分开:
if[-f Fred . c];然后
.
船方不负担装货费用
我们可以使用test命令的以下三种条件:字符串比较、算术比较和文件条件。以下三个表格显示了这些条件:
字符串比较:
如果两者相等,则String1=string2为真。
string1!=string2不相等则为真。
-n如果不为空,字符串为真
如果为空,则-z字符串为真。
算术比较:
1-eq表达式2如果相等则成立。
1-ne表达式2不相等则成立。
1-gt表达式2如果大于,则为真。
表达式1 -ge表达式2大于或等于true。
1-如果小于,则表达式2为真
1-le表达式2小于或等于true。
!表达式为真则为假。
文件:
如果是目录,则-d文件为真。
-e文件如果存在则为真(这里需要注意的是,由于历史原因-e选项是不可移植的,所以通常使用-f选项。
如果是常规文件,则-f文件为true。
如果设置了组ID,则-g文件为真。
如果文件可读,则-r文件为真
如果文件大小不为零,则-s文件为真
如果设置了用户ID,则-u file为true。
如果文件可写,则-w file为true。
如果文件是可执行的,则-x file为真。
现在我们似乎有点过了,但以下是一个例子。这里我们将测试文件/usr/bash,这样我们可以清楚地看到这些条件的用法:
#!/bin/sh
if [ -f /bin/bash ]
然后
回显“文件/bin/bash存在”
船方不负担装货费用
if [ -d /bin/bash ]
然后
echo "/bin/bash是一个目录"
其他
echo "/bin/bash不是目录"
船方不负担装货费用
在测试为真之前,所有文件测试条件必须是文件存在。该列表包含test命令的常用选项,因此我们可以查看手册页以获得完整的信息。如果我们使用bash并且test嵌入其中,我们可以使用命令help test来获得详细信息。