「学习笔记-Linux」学习Shell Script

标签: 学习 笔记 linux | 发表时间:2013-02-15 16:30 | 作者:on_1y
出处:http://blog.csdn.net

学习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!\a\n"
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 
     #      History:
     #      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的执行过程
作者:on_1y 发表于2013-2-15 16:30:15 原文链接
阅读:89 评论:0 查看评论

相关 [学习 笔记 linux] 推荐:

「学习笔记-Linux」学习Shell Script

- - CSDN博客系统运维推荐文章
学习Shell Script. 1 什么是Shell Scipt. 2.2 例2 按日期建立相似名字的文件. 3.2.4 整数,字符串,多重条件判断. 4 Shell Script 参数. 5.2 if else 结构. 8 shell script的追踪与Debug. 1 什么是Shell Scipt.

【学习笔记——Linux】Linux下正确关机方法

- - CSDN博客系统运维推荐文章
1.2 通知在线使用者关机时间. 1.1 观察系统使用状态. 联网状态:netstat -a. 后台执行的程序:ps -aux. 1.2 通知在线使用者关机时间. shutdown +2 "The machine will shutdown" # 2min 后关机,并通知在线者. 将内存中未写入硬盘的数据写入硬盘.

LINUX学习之路(学LINUX必看)

- - CSDN博客推荐文章
很多同学接触Linux不多,对Linux平台的开发更是一无所知. 而现在的趋势越来越表明,作为一 个优秀的软件开发人员,或计算机IT行业从业人员,掌握Linux是一种很重要的谋生资源与手段. 下来我将会结合自己的几年的个人开发经验,及对 Linux,更是类UNIX系统,及开源软件文化,谈谈Linux的学习方法与学习中应该注意的一些事.

shell 学习笔记

- tiger - 游戏人生
将脚本目录加到 PATH 中. 在 dash 中如何进行字符串替换. 将 rst 格式文档转换为 blog 可用的 html 代码. shell 脚本虽然不是非常复杂的程序, 但对于首次接触的我来讲, 多少还是有些忌惮. 不过, 接触任何新事物都需要勇敢面对, 逐步树立信心. 我是冲着把脚本写好去的, 所以, 我的目标是能够写出友好, 健壮, 优美的脚本..

OAuth学习笔记

- 宋大妈 - FeedzShare
来自: 标点符 - FeedzShare  . 发布时间:2011年08月29日,  已有 2 人推荐. OAuth(开放授权)是一个开放标准,允许用户让第三方应用访问该用户在某一网站上存储的私密的资源(如照片,视频,联系人列表),而无需将用户名和密码提供给第三方应用. OAuth允许用户提供一个令牌,而不是用户名和密码来访问他们存放在特定服务提供者的数据.

Vim学习笔记

- 临池学书 - C++博客-首页原创精华区
最近在学习Vimtutor中的相关内容,Vim的使用博大精深,很多命令一旦不使用就会忘记,下面把其中的没有使用到的相关命令做一个简单的总结,供以后复习使用. 至于常见的保存,插入等等命令,则不予记录,在以后的使用中加深练习即可. To change until the end of a word, type  ce (ce + 修正的单词).

OAuth学习笔记

- jiaosq - 标点符
OAuth(开放授权)是一个开放标准,允许用户让第三方应用访问该用户在某一网站上存储的私密的资源(如照片,视频,联系人列表),而无需将用户名和密码提供给第三方应用. OAuth允许用户提供一个令牌,而不是用户名和密码来访问他们存放在特定服务提供者的数据. 每一个令牌授权一个特定的网站(例如,视频编辑网站)在特定的时段(例如,接下来的2小时内)内访问特定的资源(例如仅仅是某一相册中的视频).

HTML学习笔记

- - CSDN博客推荐文章
超文本标记语言( 英文:HyperText Markup Language,HTML)是为“ 网页创建和其它可在 网页浏览器中看到的信息”设计的一种 标记语言. HTML被用来结构化信息——例如标题、段落和列表等等  点击打开链接. w3schools  点击打开链接 {语法大全,超赞.

jQuery学习笔记

- - ITeye博客
什么是jQuery,它能为我们做什么. jQuery是一个javascript类库或称之为javascript框架. 无需刷新页面从服务器获取信息. 简化常见的javascript任务. 为什么会如此流行或说得到大量用户群的支持:. 多重操作集于一行(避免使用临时变量或不必要的重复代码). jQuery利用了CSS选择符的能力,在DOM中快捷而轻松地获取元素或元素集合.

JdbcTemplate学习笔记

- - SQL - 编程语言 - ITeye博客
1、使用JdbcTemplate的execute()方法执行SQL语句. 2、如果是UPDATE或INSERT,用update()方法.    JdbcTemplate将我们使用的JDBC的流程封装起来,包括了异常的捕捉、SQL的执行、查询结果的转换等等. spring大量使用Template Method模式来封装固定流程的动作,XXXTemplate等类别都是基于这种方式的实现.