bash语句,bash命令详解

  bash语句,bash命令详解

  BASH的基本语法

  2BASH的基本语法最简单的例子就是—— Hello World!

  关于输入、输出和错误输出

  BASH中关于变量的规定(与C语言的异同)

  BASH中的基本流控制语法

  功能的使用

  2.1最简单的例子就是—— Hello World!几乎所有向读者解释编程的书籍的第一个例子都是Hello World程序,所以我们今天将从这个例子中一步一步地学习BASH。

  使用vi编辑器编辑hello文件,如下所示:

  #!/bin/bash

  #这是一个非常简单的例子

  回声你好世界

  这样,最简单的BASH程序就写好了。这里有几个问题需要说明:

  一,第一行的#号!你什么意思?

  第二,第一行的/bin/bash是什么意思?

  第三,第二行是评论吗?

  第四,呼应声明

  动词(verb的缩写)如何实施该计划

  #!它描述了hello文件的类型,有点类似于Windows系统中用不同的文件后缀来表示不同的文件类型的意思(但并不相同)。Linux系统根据

  #!字符串后面的信息决定了文件的类型。在这个问题上,学生可以使用“man magic”命令

  /usr/share/magic文件来了解更多信息。#!在BASH的第一行和后面的“/bin/bash”中

  这意味着该文件是一个bash程序,需要由/bin目录中的BASH程序解释和执行。BASH这个程序通常存储在/bin目录下,如果你的Linux

  系统比较特殊,bash可能存储在/sbin、/usr/local/bin、/usr/bin、/usr/sbin或者/usr/local/sbin中。

  在这样的目录下;如果还是找不到,可以用 locate bash find/-name bash 2/dev/null

  或者“whereis bash”来查找bash在哪里;如果还是找不到,可能需要自己安装一个BASH包。

  “这是一个…”第二行是BASH程序的注释,在BASH程序中从“#”开始(注意:后面是“!”从该行开始到结束的所有部分都被视为程序的注释。三线

  echo语句的作用是将echo后的字符串输出到标准输出。因为echo后面跟有字符串“Hello World ”,所以

  字符串“Hello World”显示在控制台终端的屏幕上。注意,BASH中的大多数语句末尾没有分号。

  如何执行程序?有两种方法:一种是显式地制定BASH来执行:

  $ bash你好或者

  $ sh hello(这里sh是bash的链接," lrwxrwx1root4aug20 05: 41/bin/sh

  ——巴什”)

  或者可以先把hello文件改成可执行文件,然后直接运行。这时,由于 #!/bin/bash

  角色,系统会自动使用/bin/bash程序来解释hello文件的执行:

  $ chmod u x您好

  $ ./你好

  这里没有直接“$ hello”因为当前目录不是当前用户可执行文件的默认目录,而设置当前目录“.”因为默认目录是一个不安全的设置。

  需要注意的是,在BASH程序执行之后,实际上在Linux系统中设置了另一个进程来运行。

  2.2关于输入、输出和错误输出在字符终端环境中,标准输入/标准输出的概念很好理解。输入是指应用程序或命令的输入,无论是来自键盘还是其他文件;输出是指应用程序或命令产生的一些信息;和

  Windows下的区别在于Linux下有一个标准错误输出的概念,主要是为了程序调试和系统维护而设置的。错误输出与标准输出分离,可以使一些高级错误信息不干扰正常输出信息,从而方便普通用户使用。

  在Linux系统中:标准输入(stdin)默认为键盘输入;默认情况下,标准输出(stdout)是屏幕输出;默认情况下,标准错误输出(stderr)也会输出到屏幕上(如上所示

  代表std标准)。在BASH中使用这些概念时,标准输出通常表示为1,标准错误输出表示为2。这里有一些例子来说明如何使用它们,特别是标准输出和标准错误输出。

  输入、输出和标准错误输出主要用于I/O重定向,也就是说,它们的默认设置需要更改。先看这个例子:

  $ ls ls_result

  $ ls -l ls_result

  以上两个命令将ls命令的结果输出重定向到ls_result文件,并将其附加到ls_result文件,而不是输出到屏幕。是输出(标准输出和标准误差输出)重定向的代表符号,连续两个。

  “”符号,即“”,意味着原始输出被附加而不是被清除。让我们看一个稍微复杂一点的例子:

  $ find/home-name lost * 2 err _ result

  此命令在“”符号前有一个额外的“2”,而“2”表示重定向标准错误输出。因为

  由于权限限制,无法访问/home目录中的一些目录,因此一些标准错误输出将存储在err_result文件中。你可以想象找到。

  /home -name lost* 2 err_result命令的结果是什么?

  如果直接执行find /home -name lost* all_result

  因此,只有标准输出存储在all_result文件中。如果我希望标准错误输出和标准输入一样存储在文件中,我应该怎么做?请看下面的例子:

  $ find/home-name lost * all _ result 2

  一个

  在上面的例子中,标准错误输出将首先被重定向到标准输出,然后标准输出将被重定向到文件all_result。这样,我们可以将所有输出存储在一个文件中。要实现上述功能,还有一个简单的方法,可以这样写:

  $ find /home -name lost* all_result

  如果这些错误消息不重要,以下命令可以帮助您避免许多无用错误消息的干扰:

  $ find /home -name lost* 2 /dev/null

  学生回去后可以再试试下面的重定向方法,看看结果会怎样。为什么?

  $ find/home-name lost * all _ result 1

  2

  $ find/home-name lost * 2 all _ result 1 2

  $ find/home-name lost * 2 1 all _ result

  另一个非常有用的重定向操作符是-。请看下面的例子:

  $ (cd /source/directory tar cf -。) (cd /dest/directory

  tar xvfp -)

  该命令的意思是通过压缩和解压缩,将/source/directory目录下的所有文件快速移动到/dest/directory目录下。这个命令在

  当/source/directory和/dest/directory不在同一个文件系统中时,它会显示出特殊的优势。

  还有以下不常见的用法:

  N-表示关闭N输入。

  -关闭标准输入(键盘)的方法

  N-表示关闭N输出。

  -表示关闭标准输出。

  2.3 BASH中关于变量的规定(与C语言的异同)好了,言归正传。我们先来看看bash中的变量是如何定义和使用的。对于熟悉C语言的程序员,我们将解释BASH中的定义和用法与C语言中的有何不同。

  2.3.1.BASH中的变量介绍。我们先从整体上把握一下bash中变量的用法,然后分析一下BASH中变量的用法和C语言中变量用法的区别。BASH中的变量不能包含保留字,也不能包含

  保留字符,如“-”和不能包含空格。

  BASH中简单2.3.1.1变量的定义是不必要的,也没有‘int I’这样的定义过程。如果要使用变量,只要之前没有定义,就可以直接使用。当然,你使用变量的第一个语句应该是给他赋一个初始值。不赋初始值也没关系,但是变量是空的(

  注意:是NULL,不是0)。不给变量赋值初始值不是好的编程习惯,虽然语法上没有异议。好了,让我们来看看下面的例子:

  首先用vi编辑以下文件hello2:

  #!/bin/bash

  #将初始化值赋予STR

  “你好,世界”

  echo $STR

  在上述程序中,我们需要注意以下几点:

  1.给变量赋值时,“=”左右不能有空格;

  第二,分号(;))不需要出现在BASH语句的末尾。);

  第三,除了在变量赋值和FOR循环语句的头中,BASH中变量的使用必须以 $ 符号开头。学生可以将上面程序中的第三行改为“echo”

  让我们再试一次,看看会发生什么。

  第四,由于BASH程序运行在一个新的进程中,所以这个程序中的变量定义和赋值不会改变其他进程或原Shell中同名变量的值,也不会影响它们的运行。

  更详细的文档甚至提到,引号内的变量不会被BASH解释为变量,比如 $STR ,而会被视为纯字符串。更标准的变量引用方法是${STR}

  这样看来,$STR只是${STR}的简化。在复杂的情况下(即可能出现歧义的情况),最好将表达式与{}一起使用。

  由于BASH中的变量不需要定义,所以没有类型。变量可以定义为字符串,也可以重新定义为整数。如果变量是整数操作的,它将被解释为整数;如果对他进行字符串操作,他就被视为字符串。请看下面的例子:

  #!/bin/bash

  x=1999年

  让我们 x=$x 1

  回显$x

  x=奥林匹克 $x

  回显$x

  关于整数变量的计算,有:-*/% ,其含义与字面意思相同。整数运算通常由

  而let expr,比如给变量x加1,可以写成:let x=$x x。

   1 或x=`expr $ x 1。

  相比较而言,整型变量和字符串变量是不同的。有关详细信息,请参见下表:

  对应的运算整数运算字符串运算相同-eq=different -ne!=大于-gt小于-lt大于或等于-ge小于或等于-le为空-z不为空-n

  例如:

  比较字符串A和B是否相等,写出:if [$a=$b]

  如果字符串A为空,则写入:if [-z $a]

  如果整数变量A大于B,则写[$ a-gt $ b]

  更详细的文档,建议用-n代替字符串比较!-z代替。(其中符号!表示求反操作)。

  BASH中的变量不仅用于对整数和字符串进行操作,还用作文件变量。BASH是Linux操作系统的外壳,所以系统的文件必须是

  BASH需要操作的重要对象,比如if [-x /root],可以用来判断/root目录是否可以被当前用户访问。下表列出了

  BASH中判断文件属性的操作符:

  运算符含义(满足以下条件时返回true)-e file file file已经存在-f file file是一个普通文件-s file file文件大小不为零-d file file是一个目录-r file file当前用户可以读取-w file file当前用户可以写入- X file file当前用户可以执行-g file设置了GID标志-u file file UID 标志已设置-O文件文件属于当前用户-G文件文件组ID与当前用户相同文件1 -nt文件2文件1比文件2新文件1 -ot文件2文件1比文件2旧

  注意:上表中的文件、文件1和文件2都是指文件或目录的路径。

  2.3.1.1.关于局部变量。如果在BASH程序中使用了一个变量,它将保持有效,直到程序结束。为了使变量存在于局部程序块中,引入了局部变量的概念。尝试

  ,当变量第一次被赋予初始值时,可以通过添加local关键字来声明局部变量,如下面的示例所示:

  #!/bin/bash

  你好=你好

  函数hello {

  本地HELLO=世界

  echo $你好

  }

  echo $你好

  你好

  echo $你好

  这个程序的执行结果是:

  你好

  世界

  你好

  这个执行结果表明,在执行函数HELLO时,全局变量$HELLO的值没有改变。也就是说,局部变量$HELLO的影响只存在于函数的块中。

  2.3.2.BASH中变量和C语言中变量的区别。这里为不熟悉Bash编程,但非常熟悉C语言的程序员总结一下在BASH环境下使用变量时需要注意的问题。

  1,BASH中的变量需要在变量前用 $ 符号引用(第一次赋值和for循环的头不需要加。

  “$”符号);

  2.BASH中没有浮点运算,所以没有浮点变量可用;

  3.BASH中整形变量的比较符号与C语言完全不同,整形变量的算术运算也需要let或expr语句处理;

  2.4 BASH BASH中的基本流程控制语法几乎包含了C语言中常用的所有控制结构,如条件分支、循环等。下面逐一介绍。

  如果.然后.elseif语句用于判断和分支,其语法规则与C语言中的if非常相似。其基本结构如下:

  如果[表情]

  然后

  陈述

  船方不负担装货费用

  或者

  如果[表情]

  然后

  陈述

  其他

  陈述

  船方不负担装货费用

  或者

  如果[表情]

  然后

  陈述

  else if [表情]

  然后

  陈述

  其他

  陈述

  船方不负担装货费用

  或者

  如果[表情]

  然后

  陈述

  elif [表情]

  然后

  陈述

  其他

  陈述

  船方不负担装货费用

  值得注意的是,如果用简洁的行写if和then,那么前面一定要加分号,比如if。

  [表情];然后.以下示例显示了如何使用if条件语句:

  #!/bin/bash

  如果[ $1 -gt 90 ]

  然后

  回声好,1美元

  elif [ $1 -gt 70 ]

  然后

  回显好,1美元

  其他

  回声坏,$1

  船方不负担装货费用

  出口0

  上面例子中的$1指的是命令行的第一个参数,这将在后面的“BASH中的特殊保留字”中解释。

  2 . 4 . 2 for循环的结构与C语言不同。在BASH中,for循环的基本结构是:

  对于[列表]中的$var

  做

  陈述

  完成的

  其中$var是循环控制变量,[list]是$var需要遍历的集合,do/done对包含循环体,相当于C语言中的一对花括号。此外,如果做

  和for写在同一行,而;必须在do之前添加。例如:对于$var in

  [列表];做.以下是使用for to循环的示例:

  #!/bin/bash

  在星期日,星期一,星期二,星期四,Fri星期六

  做

  回声$日

  完成的

  #如果列表用一对双引号括起来,则认为它是一个元素

  在“星期日,星期一,星期二,星期四,Fri星期六”这一天

  做

  回声$日

  完成的

  出口0

  请注意,在上面的示例中,for行中的变量day没有用 $ 标记,但是在循环中,echo行中的变量$day必须标记。

  “$”符号的。此外,如果在[list]部分中没有以下内容,则day将接受命令行的所有参数。比如这个程序:

  #!/bin/bash

  对于参数

  做

  echo $param

  完成的

  出口0

  上面的程序会列出所有的命令行参数。for循环结构的循环体包含在do/done对中,这也是while和until循环的特点。

  2 . 4 . 3 while while循环的基本结构是:

  while [条件]

  做

  陈述

  完成的

  请写一个例子来验证这个结构。

  2.4.4直到回路的基本结构是:

  直到[条件为真]

  做

  陈述

  完成的

  请写一个例子来验证这个结构。

  2 . 4 . 5 case bash中的case结构类似于C语言中switch语句的功能,可以用来控制多个分支。它的基本结构是:

  大小写 $var 在

  条件1)

  声明1;

  条件2)

  陈述2;

  .

  * )

  默认报表;

  environmental systems applications center 环境系统应用程序中心

  以下程序是使用case结构执行分支的示例:

  #!/bin/bash

  echo按一个键,然后按回车键。

  阅读按键

  大小写 $Keypress 在

  [a-z])回显“小写字母”;

  [A-Z])回显“大写字母”;

  [0-9])回显“数字”;

  * ) echo 标点、空白或其他;

  environmental systems applications center 环境系统应用程序中心

  出口0

  上例中“read Keypress”第四行的read语句表示从键盘读取输入。这个命令将出现在本讲义的BASH中。

  其他高级问题。

  2.4.6 break/continue熟悉C语言编程的人都熟悉break语句和continue语句。BASH中也有这两条语句,它们的功能和用法和C语言中的一样,break

  语句可以使程序流完全跳出当前循环,而continue语句可以跳过当前循环的其余部分,直接进入下一个循环。

  2.5函数的使用BASH是一种相对简单的脚本语言,但是为了结构化设计的方便,BASH还提供了函数定义的功能。BASH中的函数定义非常简单,只需编写如下:

  函数my_funcname {

  码组

  }

  或者

  my_funcname() {

  码组

  }

  上面第二种写法更接近C语言的写法。BASH要求函数的定义必须在函数使用之前,这与C语言中使用头文件解释函数的方法不同。

  更进一步的问题是如何将参数传递给函数并获得返回值。BASH中函数参数的定义不需要在函数定义时进行,只需要在调用函数时使用BASH的预留变量即可。

  $1 $2 .引用;BASH的返回值可以由return语句指定,返回一个特定的整数。如果没有返回语句显式返回返回值,则返回值是函数的最后一条语句的执行结果(通常

  0,如果执行失败则返回错误代码)。函数的返回值通过$?信守诺言去得到它。让我们看一个使用函数计算整数平方的例子:

  #!/bin/bash

  正方形(){

  让我们 res=$1 * $1

  返回$res

  }

  平方1美元

  结果=$?

  echo $result

  出口0

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: