linux基础之Shell Script入门介绍
linux基础之Shell Script入门介绍
发布时间:2016-12-28 来源:查字典编辑
摘要:linux基础之ShellScript1ShellScipt使用指令和基本程序设计结构写成的程序,可以完成复杂的处理流程1.1程序书写复制代...

linux基础之Shell Script

1 Shell Scipt

使用指令和基本程序设计结构写成的程序,可以完成复杂的处理流程

1.1 程序书写

复制代码 代码如下:

#!/bin/bash

# Program:

# This program shows "Hello Wrold" in your screen.

# History:

# 2013/2/3 on_1y First release

PATH=$PATH

export PATH

echo -e "Hello World!an"

exit 0

第一行 #!/bin/bash 说明使用的shell类型,不同shell语法可能不同,所以要说明使用的是哪种shell

其它#开始的表示注释,注释一般需要说明

程序功能

版本历史

作者及联系方式

设置好PATH变量,以便直接可以调用相应路径下的命令

程序主体部分

exit 0 表示程序执行成功,向环境返回0

1.2 程序执行

bash $bash sh01.sh #如果用sh sh01.sh而sh又不是指向bash,那么sh01.sh内的语法就会不一致,因为用 #sh去解释了bash语法写的shell script,针对这个程序,如果 #$type sh #得到sh is hashed (/bin/sh) #那么会输出-e Hello world!,而非Hello world!

复制代码 代码如下:

$./xxx.sh $chmod +x sh01.sh $./sh01.sh

source $ source sh01.sh

注:用bash和用source的不同在于,用bash执行时,shell script其实是在在父程序bash下新建了一个 bash子程序,这个子程序中执行,当程序执行完后,shell script里定义的变量都会随子程序的结束而消失, 而用source执行时,是在父程序bash中执行,shell script里定义的变量都还在。

2 简单Shell练习

2.1 例1 接收用户输入

复制代码 代码如下:

# !/bin/bash

# Program:

# This program is used to read user's input

# Site: www.jb51.net

# 2013/2/3 on_1y First release

PATH=$PATH

export PATH

read -p "Your first name:" firstname # tell user to input

read -p "Your last name:" lastname # tell user to input

echo -e "nYour full name: $firstname $lastname"

exit 0

调用:

复制代码 代码如下:

$ bash sh02.sh

Your first name:Minix

Your last name:007

Your full name: Minix 007

2.2 例2 按日期建立相似名字的文件

复制代码 代码如下:

# !/bin/bash

# Program:

# This program is used to create files according to date

# History:

# 2013/2/3 on_1y First release

PATH=$PATH

export PATH

# Get filename from user

echo -e "I will use 'touch' to create three files."

read -p "Please input your filename:" tmpfilename

# Prevent the user input [Enter]

# Check whether filename exists or not

filename=${tmpfilename:-"filename"}

# Get the final filename according to date

date1=$(date --date='2 days ago' +%Y%m%d) # date of 2 days ago

date2=$(date --date='1 days ago' +%Y%m%d) # date of yesterday

date3=$(date +%Y%m%d) # date of today

filename1=${filename}${date1}

filename2=${filename}${date2}

filename3=${filename}${date3}

# Create file

touch "$filename1"

touch "$filename2"

touch "$filename3"

exit 0

调用:

复制代码 代码如下:

$ bash sh03.sh

I will use 'touch' to create three files.

Please input your filename:WhoKnows

$ ls W*

WhoKnows20130201 WhoKnows20130202 WhoKnows20130203

3 判断式

3.1 测试文件是否存在

test -e filename会根据filename是否存在返回0或1,再交由echo显示结果:

复制代码 代码如下:

$ test -e sh01.sh && echo "Exists" || echo "Not exists"

Exists

$ test -e sh0x.sh && echo "Exists" || echo "Not exists"

Not exists

3.2 test常用选项

3.2.1 文件类型

复制代码 代码如下:

-e file :file是否存在

-f file :file是否存在且为文件

-d file :file是否存在且为目录

3.2.2 权限

-r file :file是否有读的权限

3.2.3 文件新旧比较

-nt file1 file2 : file1 是否比 file2新

3.2.4 整数,字符串,多重条件判断

-z string: string是否为空

例:输出指定文件类型及属性

复制代码 代码如下:

# !/bin/bash

# Program:

# This program is used to output type and permission of the target file

# History:

# 2013/2/3 on_1y First release

PATH=$PATH

export PATH

# Get filename from user

echo -e "Input name of the file that you want to check.n"

read -p "Filename:" filename

test -z $filename && echo "You must input a filename." && exit 0

# Check whether the file exists or not

test ! -e $filename && echo "The file '$filename' DO NOT exists" && exit 0

# Check type and permission of the file

test -f $filename && filetype="regular file"

test -d $filename && filetype="directory"

test -r $filename && perm="readable"

test -w $filename && perm="$perm writable"

test -x $filename && perm="$perm executable"

# Output result

echo "The filename:$filename is a $filetype"

echo "And Permissions are :$perm"

exit 0

调用:

复制代码 代码如下:

$ bash sh04.sh

Input name of the file that you want to check.

Filename:sh01.sh

The filename:sh01.sh is a regular file

And Permissions are :readable writable executable

3.3 使用[]判断

测试文件是否存在

复制代码 代码如下:

$ [ -e "sh01.sh" ] ; echo $?

0

$ [ -e "sh0x.sh" ] ; echo $?

1

注意[]内空格必须有

这种方法和test的test -e "sho1.sh" ; echo $? 是一致的

4 Shell Script 参数

复制代码 代码如下:

# !/bin/bash

# Program:

# This program is used to ouput parameter of the shell script

# History:

# 2013/2/3 on_1y First release

PATH=$PATH

export PATH

echo "The script's name is ==> $0"

echo "Total parameter number is ==> $#"

# Check whether number of the parameter is less than 2

[ "$#" -lt 2 ] && echo "The number of parameter is less than 2.Stop here." && exit 0

echo "The whole parameter is ==> '$@'"

echo "The first parameter is ==> $1"

echo "The first parameter is ==> $2"

exit 0

调用:

复制代码 代码如下:

$ bash sh05.sh 1a 2b 3c 4d

The script's name is ==> sh05.sh

Total parameter number is ==> 4

The whole parameter is ==> '1a 2b 3c 4d'

The first parameter is ==> 1a

The first parameter is ==> 2b

注:从以上程序可以看出与参数有关的预设变量如何表示

5 条件表达式

5.1 if 结构

复制代码 代码如下:

# !/bin/bash

# Program:

# This program is used to show if else expression

# History:

# 2013/2/3 on_1y First release

PATH=$PATH

export PATH

read -p "Please input [Y/N]" choice

if [ "$choice" == "Y" ] || [ "$choice" == "y" ];then

echo "OK, continue"

exit 0

fi

if [ "$choice" == "N" ] || [ "$choice" == "n" ];then

echo "Oh, interupt"

exit 0

fi

exit 0

调用:

复制代码 代码如下:

$ bash sh06.sh

Please input [Y/N]y

OK, continue

$ bash sh06.sh

Please input [Y/N]n

Oh, interupt

5.2 if else 结构

复制代码 代码如下:

# !/bin/bash

# Program:

# This program is used to show if else expression

# History:

# 2013/2/3 on_1y First release

PATH=$PATH

export PATH

read -p "Please input [Y/N]" choice

if [ "$choice" == "Y" ] || [ "$choice" == "y" ];then

echo "OK, continue"

exit 0

elif [ "$choice" == "N" ] || [ "$choice" == "n" ];then

echo "Oh, interupt"

exit 0

else

echo "Input [Y/N]"

fi

exit 0

5.3 case

复制代码 代码如下:

# !/bin/bash

# Program:

# This program is used to show case expression

# History:

# 2013/2/3 on_1y First release

PATH=$PATH

export PATH

read -p "Tell me your choice:[1-3]=>" choice

case $choice in

"1")

echo "Your choice is ONE"

"2")

echo "Your choice is TWO"

"3")

echo "Your choice is THREE"

esac

exit 0

调用:

复制代码 代码如下:

$ bash sh08.sh

Tell me your choice:[1-3]=>2

Your choice is TWO

$ bash sh08.sh

Tell me your choice:[1-3]=>1

Your choice is ONE

$ bash sh08.sh

Tell me your choice:[1-3]=>3

Your choice is THREE

6 函数

复制代码 代码如下:

# !/bin/bash

# Program:

# This program is used to test function

# History:

# 2013/2/3 on_1y First release

PATH=$PATH

export PATH

function myprint(){

echo -n "Your choice is "

}

read -p "Tell me your choice:[1-3]=>" choice

case $choice in

"1")

myprint;echo "ONE"

"2")

myprint;echo "TWO"

"3")

myprint;echo "THREE"

esac

exit 0

调用:

复制代码 代码如下:

$ bash sh09.sh

Tell me your choice:[1-3]=>1

Your choice is ONE

$ bash sh09.sh

Tell me your choice:[1-3]=>2

Your choice is TWO

$ bash sh09.sh

Tell me your choice:[1-3]=>3

Your choice is THREE

7 循环

7.1 while

复制代码 代码如下:

# !/bin/bash

# Program:

# This program shows while expression

# History:

# 2013/2/3 on_1y First release

PATH=$PATH

export PATH

while [ "$choice" != "yes" ]

do

read -p "Give your choice [yes/no]:" choice

done

exit 0

调用:

复制代码 代码如下:

$ bash sh10.sh

Give your choice [yes/no]:no

Give your choice [yes/no]:no

Give your choice [yes/no]:nx

Give your choice [yes/no]:yes

7.2 for

复制代码 代码如下:

# !/bin/bash

# Program:

# This program is used to demo for expression

# History:

# 2013/2/3 on_1y First release

PATH=$PATH

export PATH

for choice in 1 2 3

do

echo "your choice is $choice"

done

exit 0

调用示例:

复制代码 代码如下:

$ bash sh11.sh

your choice is 1

your choice is 2

your choice is 3

8 shell script的追踪与Debug

sh -n xx.sh # 语法检查

sh -x xx.sh # 列出xx.sh的执行过程

推荐文章
猜你喜欢
附近的人在看
推荐阅读
拓展阅读
相关阅读
网友关注
最新linuxshell学习
热门linuxshell学习
脚本专栏子分类