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

转载于:https://my.oschina.net/silvers0618/blog/997580

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