shell编程语句,shell脚本基本语法详解

  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来获得详细信息。

shell编程语句,shell脚本基本语法详解