同样为Linux shell 听课笔记,只为自己看而收藏,新手备忘录。

LinuxStudyNoteBy_Silvers:

(E:\Video_Tutorials\Linux自学视频\linux视频教程)

16:55 2016/2/21

# 什么是shell脚本

Shell除了是命令解释器之外还是一种编程语言,用Shell编写的程序类似于DOS下的批处理程序。

用户可以在文件中存放一系列的命令,通常将Shell编写的程序称为Shell脚本或Shell程序。

将命令、变量和流程控制有机地结合起来将会得到一个功能强大的编程工具。Shell脚本语言非常擅长处理文本类型的数据,由于Linux系统中的所有配置文件都是纯文本的,所以Shell脚本语言在管理Linux系统中发挥了巨大作用。

# 为什么要学习Shell Script

自动化管理

监控管理

日志数据处理

自动数据备份

# Shell脚本中的成分

Shell脚本是以行为单位的,在执行脚本的时候会分解成一行一行依次执行。脚本中所包含的成分主要有:注释、命令、Shell变量和结构控制语句。

注释——注释部分用于对脚本进行解释和说明,在注释行的前面要加上符号#,这样在执行脚本的时候Shell就不会对该行进行解释。

命令——在Shell脚本中可以出现任何在交互下可以使用的命令。

变量——Shell支持字符串变量和整型变量。

结构控制语句——用于编写复杂脚本的流程控制语句。

# Shell脚本的建立与执行

用户可以使用任何文本编辑器编辑Shell脚本文件,如vi,gedit等

对Shell脚本文件的调用可以采用两种方式:

  一种是将文件名作为Shell命令的参数,其调用格式为:

    $ sh script-file

    $ ./script-file

  当要被执行脚本文件没有可执行权限时只能使用这种调用方式。

  另一种调用方式是先将脚本文件的可访问权限改为可执行,以便该文件可以作为执行文件调用。具体方法是:

    $ chmod u+x script-file

  当执行一个脚本文件时,Shell就产生一个子Shell(即一个子进程)去执行命令文件中的命令。因此,脚本文件中的变量值不能传递到当前Shell(即父Shell)。

# Shell脚本的编码规范

一个bash脚本的正确起始部分应该以#!开头:

  #!/bin/bash

在调用bash的脚本时候,以#!开头的语句通知系统用何种解释器执行此脚本。

如果bash是你的默认shell,那么脚本的开头也不用非得写上#!。但是如果你使用不同的shell来开启一个脚本的话,比如tcsh,那么你就必须需要#!了。良好的shell编码规范还要求以注释形式说明如下的内容:

  脚本名称、脚本功能、版权声明、复杂脚本应对算法做简要说明。

# 第一个shell script

  #!/bin/bash

  # program:

  # This program shows "Hello World."

  echo -e "Hello World!\a\n"

  exit 0

# shell 变量

定义shell变量

name=string

name是变量名,变量名用小写字母命名

= 是赋值符号。两边不能有空格,否则将视为命令

string是被赋值的变量值

例如:

      v1=centos

      v2='this is a shell script test.'

shell变量表达式

  表达式                    说明

${#string}                $string的长度

${string:position}            从position开始提取字符串

${string:position:length}        从位置$position开始提取长度为$length的子串

${string#substring}            从开头删除最短匹配子串

${stirng##substring}            从开头删除最长匹配子串

${string%substring}            从结尾删除最短匹配子串

${string%%substring}            从结尾删除最长匹配子串

#变量的数值计算

变量的数值计算都是通过(())来计算的。

运算符如下所示:

  加、减、乘、除、模、幂运算等

  ((a=2+3**2-100%5))

  echo $a

  echo ((a=2+3**2-100%5))

  test与[]

  标志                    说明

  -f                      文件是否存在

  -d                    目录是否存在

  -r                    文件是否有读权限

  -w                    文件是否有写权限

  -x                    文件是否有执行权限

  test实例

#!/bin/bash

filename=/home/Document

test -f $filename && echo 'exist' || echo 'not exist'  #filename文件是否存在?

test -d $filename && echo 'exist' || echo 'not exist'  #filename目录是否存在?

test -r $filename && echo 'exist' || echo 'not exist'  #filename是否可读?

test -w $filename && echo 'exist' || echo 'not exist'  #filename是否可写?

test -x $filename && echo 'exist' || echo 'not exist'  #filename是否可执行?

  []判断注意

* 在中括号中必须都要使用空格来分隔

* 在中括号中的变量,最好都要以双引号括起来

* 在中括号中的常数,最好都以单引号括起来。

例如:

  [ "$a" == "$b" ] &&echo 'Yes' || echo "No"

  [ '12' == '10' ] &&echo'Yes' || echo "No"

[]更多的使用于条件判断

  # 单分支判断

  if []; then

        echo statement

  # 双分支判断

  if []; then

      echo statement

  else

    echo statement

  fi

  # 多分支判断

  if []; then

        echo statement

  elif

    echo statement

  elif

      echo statement

  fi

  case $name in

  1);;

  esac

#if...elif...fi多分支判断代码示例:

#!/bin/bash

# 多分支判断代码示例1

echo 'Please input your number.'

read number

if [ $number == 1 ];then

echo 'Your input number is 1.'

elif [ $number == 2 ];then

echo 'Your input number is 2.'

elif [ $number == 3 ];then

echo 'Your input number is 3'

else

echo 'I dont know what your input number.'

fi

#!/bin/bash

# 多分支判断语句代码示例2

echo 'Please input your hardware.'

read hd

if [ $hd == cpu ];then

echo 'Your cpu info is'

cat /proc/cpuinfo

elif [ $hd == mem ];then

echo 'Your memory info is'

cat /proc/meminfo

elif [ $hd == hard ];then

echo 'Your harddisk info is'

df -h

else

echo 'I dont know what you input.'

fi

#case;;;esac多分支语句代码示例:

#!/bin/bash

echo 'Please input an number.'

read number

case $number in

1)

    echo 'Your input number is 1';;

2)

    echo 'Your input number is 2';;

3)   

    echo 'Your input number is 3';;

*)

    echo 'I dont know what your input';;

esac

# shell 脚本中的循环操作

a.

while condition; do

done;

b.

untile condition; do

done;

c.

for(());do

statement

done;

循环操作代码示例:

#!/bin/bash

# [] -eq -ne -gt -ge -lt -le

# (()) == != > >= < <=

# while do 循环代码示例:

i=10

while (($i>=5));do #数值的操作需要双层小括号

echo $i;

((i--));

done;

Shell脚本中多分支,循环条件比较推荐使用中括号来写;小括号只适用于数值的比较及操作

#!/bin/bash

# []  -eq  -ne -gt -ge  -lt -le

# (()) ==  !=  >  >=  <  <=

# while do 循环代码示例:

i=10

while [ $i -gt 5 ];do

echo $i;

((i--));

done;

#until do循环

#!/bin/bash

a=10

until (($a<0));do

echo $a;

((a--));

done;

# while do 和until do 的区别:

  while do 条件表达式成立的情况下执行循环体;

  until do 条件表达式不成立的情况下执行循环体;

#for循环

#!/bin/bash

for((i=1;i<=10;i++));do

echo $i;

done;

# function 的使用

#!/bin/bash

# Output all information

function print()

{

    echo "Your input is $1"

}

echo "This program will priint your selection!"

case $1 in

"one")

    print 1;;

"two")

    print 2;;

"three")

    print 3;;

*)

    print "Usage $0 {one|two|three}";;

esac

你可能感兴趣的:(同样为Linux shell 听课笔记,只为自己看而收藏,新手备忘录。)