Linux shell脚本

Linux系统的结构

何为linux的shell?

各类程序或解释过后命令是通过Kernel(Linux内核)与Hardware(计算机硬件)交流,驱动硬件设备完成相关的行为;那么我们又通过什么与系统内核交流呢?没错的,是Shell,Shell 英文名叫“壳”,是一个处理用户请求的工具或接口,它负责解释用户输入的命令,调用用户希望使用的程序。

一个完整的Shell脚本应该包括哪些内容?

  • 脚本声明
  • 注释信息
  • 可执行语句(即命令)

e.g.

luojialin@luojialin-PC:~/Desktop$ vim schtasks_screensaver.sh
#! /bin/bash
 
#create schtasks in order to update SpiderScreensaver on rand time
 
echo "#SpiderScreensaver"  >> /etc/crontab
echo "XX */2 * * * root /usr/local/bin/XXXX/XXXX" >> /etc/crontab

上述脚本中实际上出现了三种不同的元素:

  • 第一行的脚本声明(#!)用来告诉系统使用哪种Shell解释器来执行该脚本;
  • 第二行的注释信息(#)是对脚本功能和某些命令的介绍信息,使得自己或他人在日后看到此脚本内容时,可以快速知道此脚本的作用或一些警告信息;
  • 第三、第四行的可执行语句也就是我们平时执行的Linux命令。

注:脚本中的"X"代表某些特殊数值。

linux中的sh、dash、bash的区别

参见链接:

https://blog.csdn.net/u011436427/article/details/105139536

https://www.cnblogs.com/macrored/p/11548347.html

注:Ubuntu、Deepin默认将sh重定向到dash

一、Shell之if条件

基本语法:
if [ command ]; then
     符合该条件执行的语句
fi
扩展语法:

if [ command ];then
     符合该条件执行的语句
elif [ command ];then
     符合该条件执行的语句
else

说明:

  • bash shell会按顺序执行if语句,如果command执行后且它的返回状态是0,则会执行符合该条件执行的语句,否则后面的命令不执行,跳到下一条命令。
  • 当有多个嵌套时,只有第一个返回0退出状态的命令会导致符合该条件执行的语句部分被执行,如果所有的语句的执行状态都不为0,则执行else中语句。
  • 返回状态:最后一个命令的退出状态,或者当没有条件是真的话为0。

注意:

  1. [ ]表示条件测试。注意这里的空格很重要。要注意在'['后面和']'前面都必须要有空格
  2. 在shell中,then和fi是分开的语句。如果要在同一行里面输入,则需要用分号将他们隔开。
  3. 注意if判断中对于变量的处理,需要加引号,以免一些不必要的错误。没有加双引号会在一些含空格等的字符串变量判断的时候产生错误。比如[ -n "$var" ]如果var为空会出错
  4. 判断是不支持浮点值的
  5. 如果只单独使用>或者<号,系统会认为是输出或者输入重定向,虽然结果显示正确,但是其实是错误的,因此要对这些符号进行转意
  6. 在默认中,运行if语句中的命令所产生的错误信息仍然出现在脚本的输出结果中
  7. 使用-z或者-n来检查长度的时候,没有定义的变量也为0
  8. 空变量和没有初始化的变量可能会对shell脚本测试产生灾难性的影响,因此在不确定变量的内容的时候,在测试号前使用-n或者-z测试一下
  9. ? 变量包含了之前执行命令的退出状态(最近完成的前台进程)(可以用于检测退出状态)

e.g.

#! /bin/bash
 
#compare old content
content=$(cat /etc/crontab | grep -w SpiderScreensaver)
 
echo $content
 
if [ "${content}" == "#SpiderScreensaver" ];then
    exit 1
fi

备注:

  • 执行命令行语句,需要获取其返回值时,必须使用XXX=$(XXX);
  • if语句中字符串比较,需要自带"";
  • if语句中的[]、==的前后都需要空格;

参考链接:

https://www.cnblogs.com/kaishirenshi/p/9732135.html

https://www.cnblogs.com/kaishirenshi/p/9729800.html

https://www.jb51.net/article/41571.htm

二、Shell之for循环

流程图:

 

for 循环有三种结构:一种结构是列表for循环;第二种结构是不带列表for循环;第三种结构是类C风格的for循环

1)第一类列表for循环

for语法一:

for i in a b c....

do

    commands(代码块)

done

i为变量,in为赋值:把a b c...赋值给i
for语法二:

for i in {1..5}

do

   commands(代码块) 

done

列表{1..5},循环5次,并把列表值赋值给i

支持设置步长,比如for i in {1..100..2},步长为2
for语法三:

for file in $( ls )

#for file in *

do

   commands(代码块) 

   #echo "file: $file"

done

2)第二类不带列表for循环

     由用户制定参数和参数的个数,与上述的for循环列表参数功能相同。

#!/bin/bash

echo "number of arguments is $#"

echo "What you input is: "

#for argument in "$@"

for argument

do

     echo "$argument"

done

    $#表示参数的个数,$@表示参数列表而$*则把所有的参数当作一个字符串显示。

     省略式比"#for argument in "$@""代码少了 $@参数列表,$*参数字符串。

3)第三类C风格的for循环

for((integer = 1; integer <= 5; integer++))

do

    echo "$integer"

done

    for中第一个表达式(integer = 1)是循环变量赋初值的语句,第二个表达式(integer <= 5)决定是否进行循环的表达式,退出状态为非0时将退出for循环执行done后的命令(与C中的for循环条件是刚好相反的)。第三个表达式(integer++)用于改变循环变量的语句。

参考链接:

https://blog.csdn.net/magi1201/article/details/75195983

https://blog.csdn.net/taiyang1987912/article/details/38929069

三、Shell之while循环

流程图:

语法

while 条件测试
do
  执行命令
done

 e.g.

#!/bin/bash
while read test
do
  echo ${test}
done < /home/desktop/testfile

说明:

  •  使用read有标准输入读取数据,放入变量kuangl中,如果读到的数据非空,就进入循环。
  •  把改行数据显示出来
  • 将/home/kuangl/scripts/testfile的内容转向输入将给read读取。

四、Shell之case条件

流程图:

原文地址:https://www.cnblogs.com/gd-luojialin/p/15028076.html