您的位置:首页 > 运维架构 > Shell

Shell脚本基础知识

2017-11-11 16:32 417 查看

Shell脚本基础知识

shell脚本又叫Shell Script

Shell脚本与Windows/Dos下的批处理相似,也就是用各类命令预先放入到一个文件中,方便一次性执行的一个程序文件,主要是方便管理员进行设置或者管理用的。但是它比Windows下的批处理更强大,比用其他编程程序编辑的程序效率更高,它使用了Linux/Unix下的命令。

强调内容更明白地来说,shell script就像早期dos年代的.bat,最简单的功能就是将许多指令汇整写一起,让使用者很容易地就能够一个操作执行多个命令,而shell script更是提供了数组,循环,条件以及逻辑判断等重要功能,让使用者可以直接以shell来写程序,而不必使用类似C程序语言等传统程序编写的语法。

Linux中有好多中不同的shell,但是通常我们使用bash (bourne again shell) 进行shell编程,因为bash是免费的并且很容易使用。

程序必须以下面的行开始(必须方在文件的第一行):

#!/bin/sh


  符号#!用来告诉系统它后面的参数是用来执行该文件的程序。在这个例子中我们使用/bin/sh来执行程序。

Shell脚本的注释

一般都是使用#来表示shell中的注释

当我们写好一个脚本的时候,还有赋予给这个文件的运行权限,所以我们可以使用下面这个命令:

chmod +x filename


Shell中的变量

在Shell中,所有的变量都由字符串组成,并且不需要像Java中的变量一样,先声明再赋值。

要赋值给一个变量,可以直接这么写:

a="hello world~"


如果我们要取出一个变量,那么我们可以使用$符号:

$a


是不是很简单?我也觉得好简单,但是这个东西是在linux上运行的,感觉就更牛逼了。

Shell的输出

Java中的输出我们通常使用

System.out.println


但是在shell中,直接这么写:

echo $a
echo "a is :"


刺不刺激?意不意外?开不开心?

下面是一个简单的完整的shell脚本:

#!/bin/sh
#对变量赋值
a = "hello world"
#使用并输出变量的值
echo "a is :"
echo a

4000
[/code]

输出结果:

a is :
a


但是我们经常不直接输出a,我们会使用类似EL表达式中表达变量的方式:

${a}


类似:

a=2
echo "this is ${a}nd"


这样就会打印出来:

this is 2nd


在shell中可以使用三类命令:

(1)Unix命令:

shell脚本可以随意使用任意的unix命令,但是还是有一些更常用的命令:

echo "show text" 将文字打印在屏幕上
ls 显示文件列表
cp sourcefile newfile 拷贝文件
mv oldname newname 重命名文件或者拷贝文件
rm file 删除文件
grep 'words' file 在文件中搜索字符串比如:grep 'hello' file.txt
cat file.txt 输出文件内容到屏幕上,这个和echo有什么区别啊,让我去百度一下再说
file somefile 得到文件类型
read var 提示用户输入,并将变量赋值给变量
expr 进行数学运算,比如:我们要算3+2的值:
expr 3 + 2
然后输出的值就是5
还可以计算字符串的长度:
expr length "this is a test"

find 搜索文件,比如:find -name qxf* 就是在当前目录下查找以qxf开头的文件,find的命令还有很多,如果要用的话,我们直接去找吧


(2)概念:管道,重定向和backtick

这些不是系统的命令,但是它们真的很重要的

管道(|)将一个命令的输出作为另一个命令的输入

find
用来查找特定文件,在linux下一切皆是文件,因此十分有用。
grep
用来匹配特定的文本行,全称是Global Regular Expression Print
wc
文本统计工具,全城word count。使用方法很简单。能将文件的行数、字数、字节数打印出来。
例如: wc -l text.txt
统计text.txt中文本的行数


管道的例子:

grep "hello" file.txt| wc -l
在file.txt搜索包含hello的行,并计算其行数


这里的grep命令的输出作为wc命令的输入,这种逻辑就比较复杂了,所以这种东西还是需要脑壳的。。。

重定向:将命令的结果输出到文件,而不是标准输出到屏幕

>写入文件并覆盖旧文件
>>加到文件的尾部,保留旧文件的内容


反短斜线

使用反短斜线可以将一个命令的输出作为另外一个命令的一个命令行参数。

例如:

find . -mtime -1 -type f -print
用来查找过去24小时(-mtime –2则表示过去48小时)内修改过的文件。
如果您想将所有查找到的文件打一个包,则可以使用以下脚本:
tar -zcvf lastmod.tar.gz `find . -mtime -1 -type f -print`
注意:反斜杠里面的东西就可以作为前面一个指令的参数


(3)流程控制

大多数情况下,可以使用测试命令来对条件进行测试。比如可以比较字符串、判断文件是否存在及是否可读等等…

  通常用” [ ] “来表示条件测试。注意这里的空格很重要。要确保方括号的空格

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


执行man test可以查看所有测试表达式可以比较和判断的类型。

以下有一个例子:

#!/bin/sh
if["$SHELL"="bin/bash"];then
echo "you login is a bash"
else
echo "you login is not a bash but $SHELL"
fi


变量SHELL包含了登录shell的名称,我们和bin/bash做了比较。

Shell中的

cd `dirname $0`


这个命令的意思就是打开当前文件所在的目录,我们可以新建一个test.sh,然后在里面填上:

#!/bin/sh
cd `dirname $0`
echo `pwd`


执行之后的结果是:

/home/master/shelltest


说明就显示出来了当前的文件的所在目录
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: