同样为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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,123评论 6 490
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,031评论 2 384
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,723评论 0 345
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,357评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,412评论 5 384
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,760评论 1 289
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,904评论 3 405
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,672评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,118评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,456评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,599评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,264评论 4 328
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,857评论 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,731评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,956评论 1 264
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,286评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,465评论 2 348

推荐阅读更多精彩内容