VIM编写shell脚本程序之个人体会 持续更新中。。。

1,使用VIM编译器编写shell脚本,必须了解VIM的使用:

      VIM 有三种模式:输入模式,替换模式,命令模式。

     输入模式:直接在vim中输入“i”或者按下“insert”键,左下角会有输入模式的提醒。

     替换模式:再按一下“insert”键,左下角会有替换模式的提醒。

      命令模式:按下“Esc”键就退出了上述两种模式,再按下“shift+:”组合键就进入了命令模式,它的主要功能有保存文件、退出vim等。

        例如输入“:wq”表示保存并退出。

                       “w  /home/wqt/文档/VIM_test/first”   #表示在VIM_test文件夹下新建一个first的脚本文件。

 2,编译first文件:

    编辑结束并保存后,如果要执行该脚本,必须先使其可执行:

chmod +x filename   #使first文件变成可编译的文件。

   然后再在命令行输入:输入“./filename ”即可执行该脚本。

3,Shell编程中,使用变量无需事先声明,

       需要给变量赋值时,可以这么写:

变量名=值 

4,要取用一个变量的值,只需在变量名前面加一个$ ( 注意: 给变量赋值的时候,不能在"="两边留空格 )


5,有时候变量名可能会和其它文字混淆,比如:

num=2
echo "this is the $numnd"

      上述脚本并不会输出"this is the 2nd"而是"this is the ";这是由于shell会去搜索变量numnd的值,而实际上这个变量此时并没有值。这时,我们可以用花括号来告诉shell要打印的是num变量:

num=2
echo "this is the ${num}nd"

6,需要注意shell的默认赋值是字符串赋值。比如:

var=1
var=$var+1
echo $var

       打印出来的不是2而是1+1。为了达到我们想要的效果有以下几种表达方式:

let "var+=1"
var="$[$var+1]"
((var++))
var=$(($var+1))
var="$(expr "$var" + 1)" #不建议使用
var="`expr "$var" + 1`" #强烈不建议使用,注意加号两边的空格,否则还是按照字符串的方式赋值,`为Esc下方的`,而不是单引号'。

注意:前2种方式在bash下有效,在sh下会出错。

       let表示数学运算,expr用于整数值运算,每一项用空格隔开,$[]将中括号内的表达式作为数学运算先计算结果再输出。

       Shell脚本中有许多变量是系统自动设定的,我们将在用到这些变量时再作说明。除了只在脚本内有效的普通shell变量外,还有环境变量,即那些由export关键字处理过的变量。本文不讨论环境变量,因为它们一般只在登录脚本中用到。

     在终端下运行上述代码:

  wqt@wqt-OptiPlex-380:~$ vim  /home/wqt/文档/VIM_test/first

wqt@wqt-OptiPlex-380:~$ chmod  +x  /home/wqt/文档/VIM_test/first

wqt@wqt-OptiPlex-380:~$  ./home/wqt/文档/VIM_test/first

bash: ./home/wqt/文档/VIM_test/first: 没有那个文件或目录

wqt@wqt-OptiPlex-380:~$ .  /home/wqt/文档/VIM_test/first

A is: hello world

1+1 

 7, if语句(流程控制)

        "if"表达式如果条件为真,则执行then后的部分:

if ....; then
  ....
elif ....; then
  ....
else
  ....
fi

       大多数情况下,可以使用测试命令来对条件进行测试,比如可以比较字符串、判断文件是否存在及是否可读等等……通常用" [ ] "来表示条件测试,注意这里的空格很重要,要确保方括号前后的空格。

[ -f "somefile" ] :判断是否是一个文件
[ -x "/bin/ls" ] :判断/bin/ls是否存在并有可执行权限
[ -n "$var" ] :判断$var变量是否有值
[ "$a" = "$b" ] :判断$a和$b是否相等

执行man test可以查看所有测试表达式可以比较和判断的类型。下面是一个简单的if语句:

#!/bin/bash

if [ ${SHELL} = "/bin/bash" ]; then
   echo "your login shell is the bash (bourne again shell)"
else
   echo "your login shell is not bash but ${SHELL}"
fi

变量$SHELL包含有登录shell的名称,我们拿它和/bin/bash进行比较以判断当前使用的shell是否为bash。

   8,&& 和 || 操作符

        熟悉C语言的朋友可能会喜欢下面的表达式:

[ -f "/etc/shadow" ] && echo "This computer uses shadow passwords"

   这里的 && 就是一个快捷操作符,如果左边的表达式为真则执行右边的语句,你也可以把它看作逻辑运算里的与操作。上述脚本表示如果/etc/shadow文件存在,则打印“This computer uses shadow passwords”。


     同样shell编程中还可以用或操作(||),例如:

    

    ||运算符: command1 || command2
||则与&&相反。如果||左边的命令(命令1)未执行成功,那么就执行||右边的命令(命令2);或者换句话说,“如果这个命令执行失败了||那么就执行这个命令。
1 命令之间使用 || 连接,实现逻辑或的功能。
2 只有在 || 左边的命令返回假(命令返回值 $? == 1),|| 右边的命令才会被执行。这和 c 语言中的逻辑或语法功能相同,即实现短路逻辑或操作。
3 只要有一个命令返回真(命令返回值 $? == 0),后面的命令就不会被执行。
 
示例 2
malihou@ubuntu:~$ rm ~/Desktop/1.txt || echo "fail"
在示例 2 中,如果 ~/Desktop 目录下不存在文件 1.txt,将输出提示信息。
        9, case 语句

           case表达式可以用来匹配一个给定的字符串,而不是数字(可别和C语言里的switch...case混淆)。

case ... in
   ...) do something here 
   ;;
esac

         file命令可以辨别出一个给定文件的文件类型,如:file lf.gz,其输出结果为:

lf.gz: gzip compressed data, deflated, original filename,
last modified: Mon Aug 27 23:09:18 2001, os: Unix

我们利用这点写了一个名为smartzip的脚本,该脚本可以自动解压bzip2, gzip和zip 类型的压缩文件:

 #!/bin/bash

 ftype="$(file "$1")"
 case "$ftype" in
 "$1: Zip archive"*)
    unzip "$1" ;;
 "$1: gzip compressed"*)
    gunzip "$1" ;;
 "$1: bzip2 compressed"*)
    bunzip2 "$1" ;;
 *) echo "File $1 can not be uncompressed with smartzip";;
 esac

你可能注意到上面使用了一个特殊变量$1,该变量包含有传递给该脚本的第一个参数值。也就是说,当我们运行:

smartzip articles.zip

$1 就是字符串 articles.zip。

  例子如下:

VIM编写shell脚本程序之个人体会 持续更新中。。。_第1张图片


    本人在VIM编译器和terminal下参考文档进行练习,官方tutoral如下:http://wiki.ubuntu.org.cn/Shell%E7%BC%96%E7%A8%8B%E5%9F%BA%E7%A1%80,欢迎点击!







你可能感兴趣的:(Linux)