Bash shell 编程

一、Bash shell是什么

shell是什么,Bash与shell又有什么关系。(以前我也不是特别清楚~~~~)

shell 是一个交互性命令解释器。shell独立于操作系统,这种设计让用户可以灵活选择适合自己的shell。shell让你在命令行键入命令,经过shell解释后传送给操作系统(内核)执行。

shell
是一个命令处理器(command
processor)--是一个读入并解释你输入的命令的程序。除了是一个命令中断器以外,shell还是一个程序设计语言。你可以编写shell可以解
释的程序(被称为源程序),这些源程序可以包含shell程序设计命令等等。shell除了解释命令以外,还有其他工作,它也可以配置和编程。

shell拥有自己的语言允许用户编写程序并以一种复杂方式运行。shell编程语言具有许多常用的编程语言的特征,例如:循环和控制结构等。用户可以生成像其他应用程序一样复杂的shell程序。

以下是shell功能的一个汇总:

查找命令的位置并且执行相关联的程序;

为shell变量赋新值;

执行命令替代;

处理 I/O重定向和管道功能;

提供一个解释性的编程语言界面,包括tests、branches和loops等语句。

bash是borne again shell的缩写,它是shell的一种,Linux上默认采用的是bash。当然还有sh,dash,tcsh和ksh等

1、读入变量(read)

read命令是用于从终端或者文件中读取输入的内建命令,read命令读取整行输入,每行末尾的换行符不被读入。在read命令后面,如果没有指定变量名,读取的数据将被自动赋值给特定的变量REPLY。下面的列表给出了read命令的常用方式:

read 从标准输入中读取一行并赋值给特定的变量ERPLY(没有指定变量名的话)
read one 从标准输入读取并赋值给变量one
read first last 从标准输入读取输入到第一个空格或者回车,将输入的第一个单词放到变量first中,并将该行其他的输入放在变量last中。
read -p 打印提示信息,等待输入,并赋值给默认的变量REPLY
read -t 设置超时时间(单位:秒)
read -a arry_name 将输入在清单存入到"arry_name"数组中

read示例:


1

2

3

4

5


#无变量,默认存于特定变量REPLY中

[[email protected] apache]# read    #等待控制台输入,并将结果赋值给特定内置变量REPLY。

hello           #控制台输入Hello

[[email protected] apache]# echo $REPLY  #打印变量

hello


1

2

3

4

5


[[email protected] apache]# read one two three

3 9 8  #输入1 2 3,它们之间用空格隔开。

[[email protected] apache]# echo "one is:$one,two is:$two three is:$three"

#打印结果

one is:3,two is:9 three is:8


1

2

3

4

5


[[email protected] apache]# read -p "Please input your name:" name

#输出"Please input your name"文本提示,同时等待输入,并将结果赋值给name

Please input your name:scott

[[email protected] apache]# echo "$name"

scott


1

2

3

4


[[email protected] apache]# read -t 4  -p "Enter your nmber:"

#限时4秒输入,如果过了4秒,将退出不再输入

Enter your nmber:[[email protected] apache]# echo $REPLY

#结果为空

2.  状态判断:

test是Shell中提供的内置命令,主要用于状态的检验,如果结果为0,表示成功,否则表示失败。


1

2

3

4


[[email protected] apache]# name=scott

[[email protected] apache]# test $name != scoot

[[email protected] apache]# echo $? #测试上一条命令执行状态的返回值,0表示功

0

注意的是test命令不支持Shell中提供的各种通配符


1

2

3

4


[[email protected] apache]# name=tom

[[email protected] apache]# test $name = [Tt]om

[[email protected] apache]# echo $?

1

test命令还可以中括号予以替换,其语义保持不变


1

2

3

4


[[email protected] apache]# name=tom

[[email protected] apache]# [ "$name" = tom  ]

[[email protected] apache]# echo $?

0

在Shell中还提供了另外一种用于状态判断的方式:[[ expr ]],和test不同的是,该方式中的表达式支持通配符


1

2

3


[[email protected] apache]# [[ $name==[tT]om ]]

[[email protected] apache]# echo $?

0

在[[ expression ]]中,expression可以包含&&(逻辑与)和||(逻辑或)。


1

2

3

4


[[email protected] apache]# friend=Jack

[[email protected] apache]# [[ $name==[tT]om && $friend == "Jack" ]]

[[email protected] apache]# echo $?

0

在Shell中还提供了let命令的判断方式: (( expr ))


1

2

3

4

5

6

7

8


[[email protected] apache]# a=45

[[email protected] apache]# b=34

[[email protected] apache]# (( a > b ))

[[email protected] apache]# echo $?

0

[[email protected] apache]# (( a == 45 && b == 34 ))

[[email protected] apache]# echo $?

0

下面的表格是test命令支持的操作符:

表达式
判断为真的条件

字符串判断 结果
[ StringA=String ] StringA等于StringB
[ StringA==StringB ] StringA等于StringB
[ StringA!=StringB ] StringA不等于StringB
[ String ] String不为空
[ -z String ] String长度为0
[ -n String ] String长度不为0
逻辑判断
[ StringA -a StringB ] StringA和StringB都是真
[ StringA -o StringB ] StringA或StringB是真
[ !String ] String不为真
逻辑判断(复合判断)
[[ pattern1 && pattern2 ]] pattern1和pattern2都是真
[[ pattern1 || pattern2 ]] pattern1或pattern2是真
[[ !pattern ]] pattern不为真
整数判断
[ intA -eq intB ] intA等于intB
[ intA -ne intB ] intA不等于intB
[ intA -ge intB ] intA大于等于intB
[ intA -lt intB ] intA小于intB
[ intA -le intB ] intA小于等于intB
[ intA -gt intB ] intA大于intB
文件判断中的二进制操作
[ fileA -ot fileB ] fileA比fileB旧
[ fileA -ef fileB ] fileA和fileB有相同的设备或者inode值
[ fileA -nt fileB ] fileA比fileB新
文件检验
[ -d $file ] or [[ -d $file ]] file为目录且存在时为真
[ -e $file ] or [[ -e $file ]] file为文件且存在时为真
[ -f $file ] or [[ -f $file ]] file为非目录普通文件存在时为真
[ -s $file ] or [[ -s $file ]] file文件存在, 且长度不为0时为真
[ -L $file ] or [[ -L $file ]] file为链接符且存在时为真
[ -r $file ] or [[ -r $file ]] file文件存在且可读时为真
[ -w $file ] or [[ -w $file ]] file文件存在且可写时为真
[ -x $file ] or [[ -x $file ]] file文件存在且可执行时为真
[ -S $file ] or [[ -S $file ]] 测试文件是否存在在并且是否是一个套接字文件
[ -h $file ] or [[ -h $file ]] file为链接符且存在时为真
[ -p $file ] or [[ -p $file ]] 测试文件是否存在并且是否是一个管道文件

注:在逻辑判断(复合判断中),pattern可以包含元字符,在字符串的判断中,pattern2必须被包含在引号中。

3.流程控制语句:

if语句格式如下:

if语句的后面是Shell命令,如果该命令执行成功返回0,则执行then后面的命令。

if command;then
       command
       command
 fi

用test命令测试其后面expression的结果,如果为真,则执行then后面的命令。
   if test expression
   then
       command
   fi

下面的格式和test expression等同
   if [ string/numeric expression ]
   then
       command
   fi

下面的两种格式也可以用于判断语句的条件表达式,而且它们也是目前比较常用的两种。
   if [[ string expression ]]
   then
       command

.........
   fi

if (( numeric expression ))          
   then
       command

.......
   fi

示例:


1

2

3

4

5

6

7

8

9

10

11


[[email protected] tmp]# cat test2.sh

#!/bin/bash

read -p  "Are you OK(y/n)?" answer

#这里的$answer变量必须要用双引号扩住,否则判断将失败

   if [ "$answer" = y -o "$answer" = Y ]

    then

        echo "Glad to see it."

    fi

[[email protected] tmp]# bash test2.sh

Are you OK(y/n)?y

Glad to see it.

上面的判断还可以替换为:


1

2

3

4

5

6

7

8

9

10


[[email protected] tmp]# cat test2.sh

#!/bin/bash

read  -p "Are you OK(y/n or Maybe)?" answer

#[[ ]]复合命令操作符允许其中的表达式包含元字符,这里输入以y或Y开头的任意单词,或Maybe都执行then后面的echo。

if [[ $answer == [yY]* || $answer = Maybe ]];then

        echo "Glad to hear it."

    fi

[[email protected] tmp]# bash test2.sh

Are you OK(y/n or Maybe)?yadfadsf

Glad to hear it.


1

2

3

4

5

6

7

8

9

10

11


[[email protected] tmp]# cat test3.sh

#!/bin/bash

 answer="not really"

    if [[ $answer = [Nn]o?( way |t really) ]]

     then

        echo "I am sorry."

     fi

[[email protected] tmp]# bash -n test3.sh

[[email protected] tmp]# bash test3.sh

I am sorry.

#
对于本示例中的扩展通配符,这里需要给出一个具体的解释。[Nn]o匹配No或no,?( way|t really)则表示0个或1个( way或t
really),因此answer变量匹配的字符串为No、no、Not really、not really、No way、no way。

if/elif/else语句的使用方式和if语句极为相似,其格式如下:

if command

then

command

elif command

then

command

else

command

fi


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23


[[email protected] tmp]# cat test4.sh

 read  -p "How old are you?" age

    if [ $age -lt 0 -o $age -gt 120 ]                #(( age < 0 || age > 120 ))

    then

        echo "You are so old."

    elif [ $age -ge 0 -a $age -le 12 ]               #(( age >= 0 && age <= 12 ))

    then

        echo "You are child."

    elif [ $age -ge 13 -a $age -le 19 ]            # (( age >= 13 && age <= 19 ))

    then

        echo "You are 13--19 years old."

    elif [ $age -ge 20 -a $age -le 29 ]           # ((age >= 20 && age <= 29 ))

    then

        echo "You are 20--29 years old."

    elif [ $age -ge 30 -a $age -le 39 ]             # (( age >= 30   && age <= 39 ))

    then

        echo "You are 30--39 years old."

    else

        echo "You are above 40."

    fi

[[email protected] tmp]# bash test4.sh

How old are you?60

You are above 40.

=======================================完================================================

时间: 2024-10-09 16:38:23

Bash shell 编程的相关文章

GNU Bash Shell 编程图解笔记

bash,Unix shell的一种,在1987年由布莱恩·福克斯为了GNU计划而编写.1989年发布第一个正式版本,原先是计划用在GNU操作系统上,但能运行于大多数类Unix系统的操作系统之上,包括Linux与Mac OS X v10.4都将它作为默认shell.它也被移植到Microsoft Windows上的Cygwin与MinGW,或是可以在MS-DOS上使用的DJGPP项目.在Novell NetWare与Andriod在上也有移植.1990年后,Chet Ramey成为了主要的维护者

Bash shell编程基础

1.何谓shell script shell script是利用shell的功能写一个"程序",这个程序是使用纯文本文件,将一些shell的语法与命令(包括外部命令)写在里面,搭配正则表达式,管道命令与数据流重定向,条件判断语句等功能,以达到我们所想要的处理目的. 2.脚本或程序源文件都是纯文本文件. 3.脚本或程序的执行一般有两种方式: 编译执行:预处理-->编译-->汇编-->链接:编译执行是一种计算机语言的执行方式. 由编译程序将目标代码一次性编译成目标程序,再

Bash shell编程的语法知识点(1)

Bash shell脚本编程知识点如下(初学,不全,欢迎讨论补充): shell简介 脚本的简单介绍 变量和引用 算术运算 交互式编程 选择判断 条件测试 循环 函数 shell简介 shell是一种具备特殊功能的程序,提供了用户与内核进行交互操作的一种接口,它接收用户输入的命令,并把它送入内核去执行,shell分为图形界面和命令界面(我们操作的window系统就是一种图形化shell,我们要学的bash也是she一种命令界面的shell). shell与内核和用户的关系图如下: bash sh

Bash Shell编程要点小结

一.case命令 case variable invalue1) command(s);; value2) command(s);; *) command(s);; esac 如果case变量没有被匹配,程序就执行*)后面的语句.case值中允许出现Shell通配符和竖线(|)作为OR操作符 二.if命令 if commandthen command(s) fi if test expressionthen command(s) fi if [ string/numeric expression

bash shell编程

命令行编辑: 光标跳转 ^a 跳到命令行首 ^e 跳到命令行尾 ^<- 向左跳转一个单词 ^-> 向右跳转一个单词 ^b    左移一个字符 ^f    右移一个字符 删除 ^u 删除光标至命令行首的内容 ^k 删除光标至命令行尾的内容 ^d 删除光标所在处的字符 ^h  = BackSpace功能 ^l  清屏 Bang (!) 命令 !!     执行上一条命令 !blah    执行最后一次以blah开头的命令 !$    上一条命令的最后一个参数 (Esc+. 和Alt+.都是效果相同

Linux Bash Shell编程快速入门

BASH 的基本语法 最简单的例子 -- Hello World! 关于输入.输出和错误输出 BASH 中对变量的规定(与 C 语言的异同) BASH 中的基本流程控制语法 函数的使用 2.1     最简单的例子 -- Hello World! 几乎所有的讲解编程的书给读者的第一个例子都是 Hello World 程序,那么我们今天也就从这个例子出发,来逐步了解 BASH. 用 vi 编辑器编辑一个 hello 文件如下: #!/bin/bash# This is a very simple

bash shell编程快速入门教程

Shell 俗称壳(用来区别于核),是指"提供使用者使用界面"的命令解析器(软件).它类似于DOS下的command和后来的cmd.exe.它接收用户命令,然后调用相应的应用程序. 同时,Shell又是一种程序设计语言.作为命令语言,它交互式解释和执行用户输入的命令,或者自动地解释和执行预先设定好的一连串的命令.Shell不像C/C++等语言,它不需要编译就能执行.作为程序设计语言,Shell 定义了各种变量和参数,并提供了许多在高级语言中才具有的控制结构,包括循环和分支. UNIX系

零基础学习云计算及大数据DBA集群架构师【Linux Bash Shell编程及系统自动化2015年1月20日周三】

老师讲的所有实验记录 1.写一个脚本,判断用户是否存在,如果存在则删除.若不存在,就提示不存在. 2.三个数字比大小,输出最大的 3.三个数字比大小,并且按从大到小排列 4.画斜线正反 5.达到如下效果 * *** ***** ******* ********* 6.写一个9*9乘法表 7.画一个平行四边形 8.连乘算法 while和until 9.要求根据userlist创建用户,要求指定用户名,用户id,用户的附加组及变更用户u密码,若对应用户的附加组不存在,则将附加组创建出来后再根据要求添

bash/shell编程学习(3)

接上节继续, 1. 从键盘读取输入内容 #!/bin/bash read -p 'please input something:' input echo 'your input:' $input 运行效果: ./read1.sh please input something:123 your input: 123 2. while循环及case分支 #!/bin/bash printf '\nplease input a number or character, press "q" o