bash脚本编程class 1

命令集构成的shell与变量赋予其的灵活性

    一.shell脚本的基本构成和调用方式

  shell脚本由基本文件构成,调用shell文件有两种方式:bash+file.sh或source+file.sh的绝对路径,其中后一种需要对文件添加用户执行权限。这两种调用方式都能执行shell文件,但是所执行的位置不同,有时会对当前操作造成影响。bash+file.sh相当于打开了一个子shell环境,所以在其中的操作不会影响当前shell环境的变量。而使用source或.调用shell的话,相当于在当前shell中执行,所以会影响变量。废话不多说,直接上例子:

  编写chlid.sh文件如下,赋予执行权限:

[root@localhost bin]# cat child.sh 
#!/bin/bash
num1=1
num2=20
num3=$[$num1+$num2]
echo $num3

  其内容为赋予变量num1=1,num2=20,num3=num1+num2等于20+1=21,所以执行这个shell的结果应该是21。退出文件作如下操作:

[root@localhost bin]# num3=30
[root@localhost bin]# echo $num3
30

 这里将num3赋予30的值,使用bash执行child.sh,然后检查num3的值是否变化:

[root@localhost bin]# bash child.sh 
21
[root@localhost bin]# echo $num3
30

  可以看到num3的值并没有受到影响。再使用source运行:

[root@localhost bin]# source child.sh 
21
[root@localhost bin]# echo $num3
21

  这里可以看到num3的值受到shell文件执行的影响而产生了变化。

  上例中child文件内容就是最基本的顺序执行命令的格式,最上一行的#!一定要写在行首,这时识别shell文件的必要格式,后面接上所匹配的shell类型,这里匹配的是bash,所以写为#!/bin/bash,这个格式叫做shell的首行shebang机制,如果缺少了这个,文件就不能被当成shell文件所执行。后面的行就是一个一个的单个命令,按照上下顺序执行,最后得出结果。

    二.什么是变量,它有什么用

  还是查看child.sh的文件内容,所定义的num1,2,3,甚至得到的结果都是固定的21,如此看来shell脚本过于呆滞死板,完全没有自由与灵活性。变量的出现给这个呆滞死板的shell注入了鲜活的生命,打个比方来说就像教会一个赤手空拳的远古人使用工具一样,战斗力倍增。下面我们将child.sh的内容改一下:

[root@localhost bin]# cat child.sh 
#!/bin/bash
num1=$1
num2=$2
num3=$[$num1+$num2]
echo $num3

 这里使用了$1 $2…这种变量叫做位置变量,在执行shell命令后加上参数,就会根据参数的顺序给文件中的$1,$2..赋值,如下操作:

[root@localhost bin]# child.sh  4 5
9

  这样就可以使用上述命令进行任意数的相加,child.sh的作用就变得比以前牛逼了。下面开始介绍变量的种类以及特殊变量。

  变量可以分为5类:本地变量、环境变量、局部变量、位置变量以及特殊变量。

  1.本地变量与环境变量的区别

  本地变量只作用于当前shell环境中,定义方式为name=xxx,调用方式为$name。环境变量作用于当前shell和其子shell中,可以使用export name=xxx或者declare -x name=xxx定义,调用方式同上。下面举例说明:

[root@localhost bin]# name1=10
[root@localhost bin]# echo $name1
10
[root@localhost bin]# bash
McgeeWang!   WanSui!!!!!
[root@localhost bin]# echo $name1

[root@localhost bin]# exit
exit
[root@localhost bin]# export name2=20
[root@localhost bin]# echo $name2
20
[root@localhost bin]# bash
McgeeWang!   WanSui!!!!!
[root@localhost bin]# echo $name2
20

  此例先定义本地变量name1,bash进入子进程调用name1,变量值为空。exit回到shell定义环境变量name2,bash切换至子进程中,name2的变量值仍然存在。

  2.常用特殊变量的意义

  $?:上一条命令的执行结果,0为真,非0为假

  $#:所有变量的总数

  $0:当前shell名

  $$:当前shell的进程号

  $*:传给shell的所有参数,以一个长字符串显示出来

  $@:传给shell的所有参数,以列表方式显示出来

  这里举例如下辨认$@与$*的使用区别:

制造shell脚本xxx.sh与yyy.sh,内容如下

[root@localhost bin]# cat yyy.sh 
#!/bin/bash 
xxx.sh "$@"
xxx.sh "$*"
[root@localhost bin]# cat xxx.sh 
#!/bin/bash
echo "$1"
echo "$2"
echo "$3"

  执行yyy.sh,输入多个变量1 2 3,得到结果如下:

[root@localhost bin]# yyy.sh 1 2 3
1
2
3
1 2 3

 可以看到$@代表了“1”“2”“3”,而$*代表了“1 2 3”,这就是它俩的区别。

    三.条件判断和逻辑运算脚本中在的使用

  test命令有三种格式,作为判断真假

  test  条件

  [ 条件 ]

  [[ 条件 ]]

  而test又分为数值测试,字符串测试,文件测试这几种:

  1.数值测试(只用于比较数值):

  -eq:是否等于

  -ge:是否大等于

  -gt:是否大于

  -le:是否小等于

  -lt:是否小于

  2.字符串测试(只用于比较字符串):

  ==:是否等于

  >:ascii码是否大于

  <:ascii码是否小于

  !=:是否不等于

  =~:左侧是否匹配右侧的字符串格式(一般使用[[]]的格式,并且支持glob通配符)

  -z “string”:string是否空,空为真,不空为假

  -n “string”:string是否为不空,不空为真,空为假

  3.文件测试:

  -a file:file是否存在

  -e file:file是否存在

  -b file: file是否存在且为块设备文件

  -c file:file是否存在且为字符设备文件

  -d file:file是否存在且为目录文件

  -f file:file是否存在且为普通文件

  -h / -L file:file是否存在且为符号链接文件

  -p file: file是否存在且为命名管道文件

  -s file:是否存在且为套接字文件

  

  -r file:是否存在且可读

  -w file: 是否存在且可写

  -x file:是否存在且可执行

  -g file:是否存在且拥有sgid权限

  -u file:是否存在且拥有suid权限

  -k file:是否存在且拥有sticky权限

  

  -s file:是否存在且内容非空

  

  -t fd:fd表示文件描述符是否已经打开并且与某终端相关

  -N file:文件上一次被读取之后是否被修改过

  -O file:当前有效用户是否为文件属主

  -G file:当前有效用户是否为文件属组

  file1 -ef file2:file1与file2是否指向同一个inode

  file1 -nt file2:file1是否新于file2

  file1 -ot file2:file1是否旧于file2

  

  &&(与)、||(或)、!(非),联合test命令的判断结果可以实现命令的选择执行方式。简单来说,command1 && command2,当command1为真,command2才会执行。command1 || command2,当command1为假,command2才会执行。这样就实现了命令的选择执行。举例如下:

[root@localhost bin]# cat judgefile.sh 
#!/bin/bash
read $1
[[ $1 =~ .*\.sh$ ]] && chmod +x $1 && echo '+x' || echo 'do not +x'

 这个shell文件的内容为判断输入文件名是否为.sh结尾,如果是,则加上执行权限并打印“+x”,如果不是,则只打印“do not +x”。

原创文章,作者:mcgeewang,如若转载,请注明出处:http://www.178linux.com/34362

(0)
mcgeewangmcgeewang
上一篇 2016-08-15
下一篇 2016-08-15

相关推荐

  • 马哥教育网络班22期+第2周课程练习

    一、Linux上的文件管理类命令都有哪些,其常用的使用方法及其相关示例演示。     Linux上文件管理类命令常用的有:pwd、ls、cd、cp、touch、mv、rm、rmdir (1)pwd:显示当前路径,打印工作目录(Print Working Directory) (2)ls:查看指定目录下的内容 参数 说明 -a 列举目录中的…

    Linux干货 2016-08-29
  • tomcat

    编程语言: 硬件级:微码编程,汇编语言 系统级:C,C++,… 应用级:Java, PHP, Python, Ruby, Perl, C#, … 程序:指令+数据 过程式编程:以指令为中心,数据服务于代码; 对象式编程:以数据为中心,指令服务于数据; java Java代码的运行:*.java(source code) –…

    Linux干货 2017-07-03
  • shell脚本初步

    shell脚本编程初步 程序:由数据和指令组成, 指令:由程序文件提供 数据:可以通过IO设备、文件、管道来得到, 程序:算法+数据结构 变量:变量名+变量名指向的内存空间 变量赋值: name = value变量类型:存储格式:字符 数值(精确数值 近似数值)   表示数据范围  &nb…

    Linux干货 2016-08-15
  • linux软件包管理(开始上正菜了)

    linux程序包管理:     API:数据接口     ABI:应用程序二进制接口        库级别的虚拟化:             linux:wine    …

    Linux干货 2017-03-07
  • NET25-第11周作业

    1、详细描述一次加密通讯的过程,结合图示最佳。 第一步:他们需要实现协商好对称加密算法,单向加密算法,公钥加密算法,交换公钥等。 第二步:B用户想要将数据传给A,首先需要使用单向加密算法取出数据的特征码,并用自己的私钥对这段特征码进行加密(数字签名),B用户生成临时对称密钥,并用对称密钥加密整段数据,B用户使用 A用户的公钥加密一次性对称密钥,附加在整段数据…

    Linux干货 2017-05-15
  • LAMP系列之(php-fpm模式)分布三台机器部署

    LAMP系列之(php-fpm模式)分布三台机器部署 现在我们需要做一个实验,就是把apache , php-fpm , mariadb ,分别安装在3台机器上,协同工作具体如下: 192.168.42.150 apache 192.168.42.151 php-fpm 192.168.42.152 mariadb 关闭防火墙 关闭selinux 分别给这3…

    Linux干货 2017-06-03