前言:最近再看鸟哥的Linux私房菜,这本书内容很多,很厚,看的时候,可以挑着看。我就是挑着看的,只看了第三部分,主要讲的是shell和shell script,还有正则表达式等比较重要的内容。
shell script:就是利用shell的功能写一个“程序”(program),这个程序是使用纯文本文件,将一些shell的语法和命令写在里面,搭配一些正则表达式、pip命令与数据流定向等功能,以达到我们想要的处理目的。
至于为什么要学shell script,原因太多了。。。
第一个shell script的编写与执行
shell script编写过程中,我们需要注意一些问题,下面我将列出来
1 | 命令的执行是自动从上到下、从左到右的分析与执行 |
2 | 命令的执行:命令、参数间的多个空格都会被忽略掉 |
3 | 空白行也会被忽略掉,并且tap键所得的空白同样也视为空格键 |
4 | 如果读到了一个enter符号,就开始尝试执行该行命令 |
5 | 至于如果一行内容太多,则可以使用“\[Enter]"来扩展下一行 |
6 | ”#“可作为批注。任何加在#后面的内容都会被视作批注文字而被忽略 |
#!/bin/bash
2 #progam:
3 # This programs shows "Hello World!" in your screen.
4 #history:
5 #2017/07/27 zhangguyuan
6 read -p "please input yourname:" firstname
7 echo " yourname is:$firstname"
8 exit 0
可以看下这个简单的shell script,有以下几点需要说明一下:
1、第一行#!/bin/bash声明这个script使用的shell名称
因为我们使用的是bash,所以必须以#!/bin/bash来声明这个文件内的语法使用bash的语法
2、程序内容的说明
整个shell script中,除了第一行的#!是来声明shell的之外,其他的#都是批注
3、主要程序部分
在这个程序中就是echo那一行
编写shell script的好习惯
如果其他任何一种编程语言,都需要养成良好的编程习惯,便于我们后期程序的维护
一个好的shell script应该包含一下信息:
1、script的功能
2、script的版本信息
3、script的作者和联络方式
4、script的版权声明方式
5、script的history
6、script内比较特殊的命令,使用”绝对路径“的方式执行
7、script执行所需要的环境变量预先声明与设置
===================================================================================================
简单的shell script练习
1、我们首先来看一个简单的范例吧:
#!/bin/bash
2 #program:
3 # user input 2 integer numbers;program will cross these two numbers.
4 echo "you should input 2 integer numbers,i will cross them\n"
5 read -p "first number:" firstnu
6 read -p "second number:" secnu
7 total=$(($firstnu+$secnu))
8 echo "\n the result of $firstnum $secondnum is $total"
9
read -p允许用户输入数据保存在变量里面,total是两着的计算结果
2、利用test命令的测试功能(亲测比较好用)
当我要检测系统上面某些文件或者是相关属性时,利用test这个命令来工作真是好用得不得了,举例来说,我要检查/dmtsai是否存在时使用:
test -e /dmtsai && echo "exist" || echo "not exist"
如果当前目录下存在dmtsai这个文件,则会显示exist,否则not exist
3、利用判断符号[]
除了使用我喜欢的test之外,其实我们还可以利用判断符号"[]"来进行数据的判断,举例来说,我们想要知道$HOME这个变量是否为空的时候,可以这样做:
[ -z "$HOME" ]; echo $?
使用中括号的时候必须要特别注意,这个问题我开始使用的时候,找了好久的errors,直接无语死了,shell script的语法比其他的编程语言要更加严格,有点和golang类似严格。因为中括号要用到很多地方,包括通配符与正则表达式等。如果要在bash的语法中使用中括号作为shell的判断句,必须要注意中括号的两端需要有空格符来分隔。假设我使用0来表示空格键,那么这些地方需要使用空格键。举个例子:
[0"$HOME"0=0"$MAIL"0]
4、条件判断
*单层、简单的条件判断
if [条件判断式]; then
条件成立,可以进行的工作内容
fi<===结束if的意思
举个例子:
1 #!/bin/bash
2 read -p "please input (y/n)" yn
3 if [ "$yn" = "Y" ] || [ "$yn" = "y" ] ; then
4 echo "ok,continue"
5 exit 0
6 fi
7 if [ "$yn" = "N" ] || [ "$yn" = "n" ] ; then
8 echo "no,interrupt"
9 exit 0
10 fi
11 echo "i dont know what your choice is" && exit 0
*多重、复杂条件判断
if [ 条件判断式 ]; then
条件成立,执行的工作
else
条件成立执行的工作
fi
if [ 条件1 ]; then
条件1成立执行的工作
elif [ 条件2 ]; then
条件2成立执行的工作
else
当1、2都不成立的时候,执行的工作
fi
5、利用case...esac判断
case $变量名字 in 《==关键字case,还有变量前的$
"第一个变量内容”)
程序段
;; 《==每个类型结尾使用两个分号结束来处理
"第二个变量内容“)
程序段
;;
esac 《==最后的case结尾
举个例子
#!/bin/bash
2 case $1 in
3 "hello" )
4 echo "hello,how are you"
5 ;;
6 "")
7 echo "you must ,ex> {$0 someword}"
8 ;;
9 *)
10 echo "usage $0 {hello}"
11 ;;
12 esac
6、利用function功能
什么是函数呢?简单的说,function可以在shell script当中做出一个类似自定义的执行命令的东西,最大的功能就是帮我们简化很多的程序代码function的语法如下:
function fname(){
}
但是有一点需要说明的是,这种语法在ubtun14.0版本上是会errors的,正确的需要去掉function,就ok。
举个例子
#!/bin/bash
2 printit () {
3 echo "your choice is $1"
4 }
5
6 case $1 in
7 "one")
8 printit 1
9 ;;
10 "two")
11 printit 2
12 ;;
13 "three")
14 printit 3
15 ;;
16 * )
17 echo "usage $0 {one|two|three}"
18 ;;
19 esac
~
~
-------------------------------------------------------------------------------更新-------------------------------------------------
7、循环
1、while do done,until do done
一般来说,不定循环最常见的就是下面的这两种状态
while [ contion ]
do
程序段落
done
until [ contion ]
do
程序段落
done
for var in con1 con2 con3
do
程序段落
done
for ( (初始值;限制值;执行步长) )
do
程序段落
done