学习shell script

≡放荡痞女 提交于 2020-02-22 17:44:39

1.什么是shell script

shell script 就是一种程序化脚本。shell是让用户和系统沟通的一种工具,我们所使用的bash就是shell的一种。而shell script 就是用shell功能来写一个程序。

1.1.编写第一个script程序

第一个程序的功能就是简单输出hello world

zhangsan@Aliyun:~$ mkdir script; cd script
zhangsan@Aliyun:~$ vim zhangsan01.sh
  1 #!/bin/bash
  2 # This is the program show "Hello world"
  3 PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
  4 export PATH
  5 echo -e "Hello world! \a \n"
  6 exit 0  #离开script回传给系统一个0 这里也可以回传其他值
zhangsan@Aliyun:~$ chmod +x zhangsan01.sh 
# 加上执行权限
zhangsan@Aliyun:~$ ./zhangsan01.sh 
Hello world! 

1.2.script编程的良好习惯

在写程序的时候,需要保持好的习惯(好记性不如烂笔头)。在每个script程序执行时,我们需要处理好:
1.script的功能
2.script的版本信息
3.script的作者与联络方式

2.简单范例

2.1.交互式脚本

  1 #!/bin/bash
  2 # Program:
  3 #       User input his first name and last name,Program show his full name
  4 # History:
  5 # 2020/02/20 kaitokuroba
  6 PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
  7 export PATH
  8 
  9 read -p "Please input your first name:" firstname
 10 read -p "Please input your last name:" lastname  
 11 echo -e  "\n Your full name is $firstname $lastname"
 12 exit 0
zhangsan@Aliyun:~$ ./zhangsan02.sh    
Please input your first name:san
Please input your last name:zhang
Your full name is san zhang

2.2.随日期变化

filename没有被定义的话,文件的名字就是filename,filename被定义过后,就是定义的名字。

  1 #!/bin/bash
  2 # Program
  3 #       Program creat three files, which named by user's input
  4 #       and date command.
  5 #History
  6 #       2020/0220/
  7 PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
  8 export PATH
  9 set -x
 10 echo -e "I will use touch command to create 3 files." 
 11 read -p "Please input your filename:" fileuser
 12 
 13 filename=${fileuser:-"filename"} #变量分析,若是filesuer存在,则用filesuer,若不存在,则用filename.
 14 
 15 date1=$(date --date='2 days ago' +%Y%m%d)
 16 date2=$(date --date='1 days ago' +%Y%m%d)
 17 date3=$(date +%Y%m%d)
 18 file1=${filename}${date1}
 19 file2=${filename}${date2}
 20 file3=${filename}${date3}
 21 
 22 
 23 touch "$file1"
 24 touch "$file2"
 25 touch "$file3"

2.3.不同的script的执行方式的区别

直接执行方式来执行script
无论是用绝对路径还是相对路径来执行script,其都会调用一个新的bash,即其是在子进程中执行的。
利用source
利用source命令来执行的话,就是在父进程执行,
330030192217601

3.判断指令

3.1.test命令的用法

test可以用来作为文件类型检测,文件权限检测以及文件新旧程度比较的工具。

zhangsan@Aliyun:~$ test -e /dmtsai && echo "exist" || echo "Not exist"
Not exist

这里写了一个判断文件类型的脚本

  1 #!/bin/bash
  2 # 功能
  3 # 用户输入一个文件名
  4 # 我们判断:
  5 # 1.文件是否存在,不存在打出“filename does not exist”
  6 # 2.若文件存在则,判断是文件还是目录,输出filename is regular file 
  7 #                               或者,输出filename is directory
  8 # 3.判断执行者的权限并输出
  9 
 10 set -x
 11 read -p "Please input your filename: " filename
 12 test -e /$filename || echo "filename does not exist" 
 13 test -e /$filename || exit
 14 test -f /$filename && echo "filename is regular file" 
 15 test -d /$filename && echo "filename is directoty"
 16 
 17 
 18 test -r /$filename && echo "有读权限"
 19 test -x /$filename && echo "有执行权限"
 20 test -w /$filename && echo "有写权限"
 21 

3.2.脚本文件的默认变量

脚本文件后面也可以添加参数。在执行脚本文件时,可以向里面加入参数,就像我们在使用函数一样。具体的变量指代如下所示:

/path/to/scriptname opt1 opt2 opt3
         $0          $1   $2   $3

现在举一个例子:文件名称为sh05.sh

  1 #!/bin/bash
  2 # Program
  3 #       Prpgram shows the script name, parameters
  4 #
  5 
  6 echo "the script is     ==> $0 "
  7 echo "Total parameter number is  ==> $#"
  8 [ "$#" -lt 2 ] &&  echo "The number of parameter is less than 2. Stop here." && exit 0
  9 
 10 echo "Your whole parameter is ==> '$@' "
 11 echo "The first parameter    ==> $1"
 12 echo "The second paremeter  ==> $2"                                    

执行这个文件的结果:

zhangsan@Aliyun:~$ ./sh05.sh 1 2 3 4 5
the script is 	==> ./sh05.sh 
Total parameter number is  ==> 5
Your whole parameter is ==> '1 2 3 4 5' 
The first parameter    ==> 1
The second paremeter  ==> 2

当然,我们的这个变量也是可以偏移的,即输入的变量可以被切割。本来五个变量 1,2,3,4,5。输入shift 2,那么前两个变量就会被删除。

4.条件判别

4.1.利用 if…then

单侧,简单条件判别式

if [ 条件判断式 ]; then
	当条件判断式成立时,可以进行的命令工作内容
fi 

由if,then举例说明:

  1 #!/bin/bash
  2 #Program
  3 
  4 
  5 read -p "Please input (y/n): " yn
  6 
  7 if [ "$yn" == "y" ] || [ "$yn" == "Y" ]; then
  8         echo "OK, continue"
  9         exit 0
 10 fi
 11 
 12 if [ "$yn" == "n" ] || [ "$yn" == "N" ]; then
 13         echo "Oh, interrupt"
 14         exit 0
 15 fi
 16 echo "I don't know what your choice is:" && exit 0

不希望用户由键盘输入时,可以用上一节所使用的参数$1

  1 #!/bin/bash
  2 # Program
  3 #       check $1 is equal to "hello"
  4 #
  5 #
  6 
  7 if [ "$1" == "hello" ]; then
  8         echo "Hello, how are you!"
  9 elif [ "$1" == "" ]; then
 10         echo "You must input parameter, ex> {$0 someword}"
 11 else
 12         echo "the only parameter is 'hello' , ex> {$0 hello}"
 13 fi
 14        

4.2.利用case…esac判断

case $变量名称 in  <==关键字为case,还有变量前有s
	"第一个变量内容")
	程序段
	;;
	"第二个变量内容")
	程序段
	;;
	*)      最后一个变量用*代表
	exit 1
	;;
esac

4.3.function函数

这里的函数和其他语言的差不多意思,可以简化代码,避免板砖。在shell script中,function的语法是这样的:

function fname()  {
		 程序段
}

下面是一个利用function的例子:

  1 #!/bin/bash
  2 # Program
  3 #       Use function to repeat information
  4 
  5 function printit () {
  6         echo "your choice is $1"
  7 
  8 }
  9 
 10 echo "This progranm will print your selection"
 11 
 12 case $1 in
 13         "one")
 14                 printit 1
 15                 ;;
 16                 
 17         "two")
 18                 printit 2
 19                 ;;
 20         "three")
 21                 printit 3
 22                 ;;
 23         *)      
 24                 echo "Useage $0 {one|two|three}"
 25                 ;;
 26 esac

具体使用如下:

zhangsan@Aliyun:~$ ./sh09.sh one
This progranm will print your selection
your choice is 1
zhangsan@Aliyun:~$ ./sh09.sh four
This progranm will print your selection
Useage ./sh09.sh {one|two|three}

5.循环loop

5.1. while do done, until do done

不定循环的两种方式,一种就是while,开始时满足循环条件,之后跳出循环;另一种是until,开始时不满足循环条件,之后跳入。
while do done condition条件不成立时,终止循环

while [ condition ] <==中括号内为判别式
do				<==do 是循环的开始
	程序段落
done          <==循环结果

until do done 当condition条件成立时,就终止循环

until [ condition ] <==中括号内为判别式
do				<==do 是循环的开始
	程序段落
done          <==循环结果

5.2. for…do…done

for循环就是已经知道要循环几次。

for var in con1 con2 con3...
do
	program!
done

查找账号:

  1 #!/bin/bash
  2 # Program
  3 
  4 users=$(cut -d ':' -f1 /etc/passwd)
  5 for username in $users
  6 do
  7         id $username
  8         finger $username
  9 done        

5.3 for…do…done数值处理

格式如下

for ((初始值;限制值;执行步长))
do
	程序段
done
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!