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