【linux】shell编程 脚本语法

1.对shell的认识

        shell是linux中一个重要的层次,他是用户与系统交互作用的界面。最常见的使用方式:在介绍linux命令时,shell都是作为命令解释程序出现:他接收用户打入的命令,进行分析,创建子进程实现命令所规定的的功能,等子进程终止工作后,发出提示符。

        shell除了作为命令结束程序以外,还是一种高级程序设计语言,他有不变量,关键字,有各种控制语句,如if,case,while,for等语句,有自己的语法结构。利用shell程序设计语言可以编写出功能很强、但代码简单的程序,特别是它把相关的linux命令有机的组合在一起,可以大大提高编程的效率,充分利用linux系统的开放性能,设计出适合自己要求的命令。

        由于历史原因,Unix系统上有许多种shell,在linux下,最常用的一种是bash:

                bash ( Bourne Again Shell): 由GNU 开发的 Shell, 主要目标是与 POSIX 标准保持一致,同时兼顾对 sh 的兼容,bash csh ksh 借鉴了很多功能,是各种 Linux 发行版标准配置的 Shell, Linux 系统 上/bin/sh 往往是指向 /bin/bash 的符号链接。虽然如此, bash sh 还是有很多不同的,一方面, bash 扩展了一些命令和参数,另一方面, bash 并不完全和 sh 兼容,有些行为并不一致,所以 bash需要模拟 sh 的行为 : 当我们通过 sh 这个程序名启动 bash 时, bash 可以假装自己是 sh 不认扩展 的命令,并且行为与sh 保持一致。
        凡是用which命令查不到程序文件所在位置的命令都是内建命令,内建命令没有单独的man手册,要在man手册中查看内建命令,应该执行 man bash-builtins
         内建命令虽然不创建新的进程,但也会有ExitStatus,通常也用0表示成功非零表示失败,虽然内建命令不创建新的进程,但执行结束后也会有一个状态码,也可以用特殊变量¥?读出。  

 2.执行脚本

        编写一个简单的脚本shell.sh

#!/bin/bash
date

echo "helloworld"
echo
echo "we are BSP2208 class"
echo
/bin/pwd
echo
echo "this is shell脚本"
/bin/ls
shell脚本中用#表示注释,相当于C语言的//注释。但如果#位于第一行开头,并且是#!(称为shebang)例外,他表示该脚本使用后指定的解释器/bin/sh解释执行。如果把这个脚本加上可执行权限然后执行:

 

        执行方法有三种:

                        1》./shell.sh

                        2》. shell.sh

                        3》source shell.sh

                        4》特例:用bash程序直接执行文件时,不需要脚本文件有可执行权限

                                        /bin/bash ./shell.sh

 如果将命令行下输入的命令用括号括起来,那么一会fork出一个子shell执行小括号中的命令,一行中可以输入由分号隔开多个命令

                (cd ..; ls -l)   //不会改变工作目录         与不带括号   cd ..; ls -l    执行结果一样

 3.shell语法

        数据类型只有字符串Shell 变量名通常是以字母或下划线打头的字母、数字和下划线字符序列,并且大小写字母意义不同

有两种类型的Shell变量:环境变量和临时变量

        环境变量:可以从父进程传给子进程,因此Shell进程的环境变量可以从当前Shell进程传给fork出来的子进 程。用printenv命令可以显示当前Shell进程的环境变量。 与env查看环境变量一致

        临时变量:只存在于当前Shell 进程,用set命令可以显示当前Shell进程中定义的所有变量(包括临时变量和环境变 量)和函数。

环境变量是任何进程都有的概念,而临时变量是 Shell 特有的概念。在 Shell 中,环境变量和临时变量的定 义和用法相似。在Shell中定义或赋值一个变量:

 

 注意:等号两边不能有空格,否则会被shell解释成命令和命令行参数

5,文件名代换

        这些用于匹配的字符称为通配符,如:*?[ ] 具体如下:

                *:匹配0个或多个任意字符

                ?:匹配一个任意字符

                [若干字符]:匹配方括号中任意一个字符的次出现一次的文件名 

 

                注意,Globbing 所匹配的文件名是由 Shell 展开的,也就是说在参数还没传给程序之前已经展开了,比如上述Is ch0[012].doc 命令,如果当前目录下有 cho00.doc ch02.doc ,则传给 Is 命令的参数实际上是 这两个文件名,而不是一个匹配字符串
6.命令代换
        由“ ' ”反引号括起来的也是一条命令,shell先执行命令,然后将输入结果立刻代换到的那个钱命令行中。
        例如:定义一个变量存放date命令的输出:
                

         命令代换也可以用 $()表示   命令:DATE=$(date)     (例程见上图)

7.算数代换

        使用$(()),用于算数计算,(())中的shell变量取值将转换成整数,同样含义的$[ ]等价:

        例如:    echo $(($var+3))      等价于$((var+3))或$[var+3]  

        $(())中只能用 +-*/ () 运算符,并且只能做整数运算
        $[base#n],其中 base 表示进制, n 按照 base 进制解释,后面再有运算数,按十进制解释
7.转义字符
        和C语言类似,\在shell中被用作转义字符,用于去除紧跟其后的单个字符的特殊意义(回车除外),换句话说,紧跟其后的字符取字面值
例如:echo \$PATH           或者   echo \\
        

         创建文件  --test

                touch --test    //报错

        因为各种Unix命令都把-号开头的命令行参数当做命令的选项,而不会当做文件名,如果非要处理以-号开头的文件名,可以两种方法

        touch -- --test     或者touch ./--test

         \ 还有一种用法,在\ 后敲回车表示续行, Shell 并不会立刻执行命令,而是把光标移到下一行,给出一 个续行提示符> ,等待用户继续输入,最后把所有的续行接到一起当作 - 一个命令执行。例如 :

  8.单引号

        Shell 脚本中的单引号和双引号一样都是字符串的界定符,而不是字符的界定符。单引号用于保持引号内 所有字符的字面值,即使引号内的\和回车也不例外,但是字符串中不能出现单引号。如果引号没有配对 就输入回车,Shell 会给出续行提示符,要求用户把引号配上对。例如:

                        echo "abcde"

                        echo 'abcde'

 9.双引号

        被双引号括住的内容,将被视为单一字串。它防止通配符扩展,但允许变量扩展。单引号不能展开变量。

 10.条件测试

命令 test [ 可以测试一个条件是否成立,如果测试结果为真,则该命令的 Exit Status 0 ,如果测试结 果为假,则命令的Exit Status 1 。例如测试两个数的大小关系:
user02$ VAR=2
user02$ test $VAR -gt 1
user02$ echo $?

 

虽然看起来很奇怪,但左方括号 [ 确实是一个命令的名字,传给命令的各参数之间应该用空格隔开,比 如:$VAR -gt 3 ] [ 命令的四个参数,它们之间必须用空格隔开。命令 test [ 的参数形式是相同 的,只不过test 命令不需要 ] 参数。以[命令为例,常见的测试命令如下表所示:

 C语言类似,测试条件之间还可以做与、或、非逻辑运算:

 例程:

11.分支

        if/then/elif/fi和C语言类似,在Shell中用ifthenelif else fi 这几条命令实现分支控制。这种流程控制语句本质 上也是由若干条Shell命令组成的

#! /bin/bash
if [ -f shell.sh ];then
	./shell.sh
	echo "shell.sh is a file and exsit"
else
	echo "shell.sh is not exsit"
fi

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值