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编程中还可以用或操作(||),例如:
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编译器和terminal下参考文档进行练习,官方tutoral如下:http://wiki.ubuntu.org.cn/Shell%E7%BC%96%E7%A8%8B%E5%9F%BA%E7%A1%80,欢迎点击!