Shell脚本基本概念

  • 一组命令的集合
  • 把脚本文件提交给Bash解释执行
  • 支持以编程的方式编写命令
  • 支持自动化运维

脚本的执行方式

    第1种方式 

  • 设置脚本文件的可执行权限  (chmod  a+x  myscript.sh)   
  • 指定脚本文件的绝对路径或相对路径直接执行  myscript.sh

    第2种方式 

  • 使用shbash命令执行脚本文件,把文件名作为shbash命令的参数
  • sh其实是bash的链接文件
  • 不管脚本文件有没有可执行权限,都可以采用这种方式执行
  • sh  myscript.sh  // 相当于 bash myscript.sh

    第3种方式

  • 使用source命令或点运算符“.”执行脚本文件,后跟脚本文件名
  • source  myscript.sh  // 相当于 . myscript.sh

    三种方式区别 

  • 前两种方式,脚本文件在当前Bash进程的子进程中执行
  • 3种方式则是直接在当前Bash进程中执行

    示例:

      编写简单的hello world脚本,查看脚本内容,并运行 

[fy@localhost 20220514]$ vi hello.sh
[fy@localhost 20220514]$ cat hello.sh
#!/bin/bash
echo "hello world"
[fy@localhost 20220514]$ sh hello.sh
hello world

运算符和条件测试 

  算术运算 

  • 采用“$(( exp ))”进行整数间的算术比较运算
  • 运算符包括“<><=>===!=
  • 如果比较结果为,表达式返回1否则返回0

    示例:

      练习加减乘除、比较等基本的算术运算

[fy@localhost 20220514]$ vi 1.sh
[fy@localhost 20220514]$ cat 1.sh
#!/bin/bash
a=9;b=10
echo $((a+b))
echo $((a-b))
echo $((a*b))
echo $((a/b))
echo $((a > b))
echo $((a >= b))
echo $((a < b))
echo $((a <= b))
echo $((a == b))
echo $((a != b))
[fy@localhost 20220514]$ sh 1.sh
19
-1
90
0
0
0
1
1
0
1

  test条件测试

  • 主要用于判断一个表达式的真假,亦即表达式是否成立
  • 如果表达式为test命令返回0值,否则返回一个0
  • 使用 “$?”特殊变量获取test命令的返回值

      1.关系运算: 

     

    示例: 使用test命令对两个数值比较(等于、小于、大于等于),注释说明含义。

[fy@localhost 20220514]$ vi 2.sh
[fy@localhost 20220514]$ cat 2.sh
#!/bin/bash
a=16;b=20
test $a -eq $b && echo "$a = $b" || echo "$a != $b" #如果a=b输出a=b,否则输出a!=b
test $a -lt $b && echo "$a < $b" || echo "$a >= $b" #如果a<b输出a<b,否则输出a>=b
test $a -ge $b && echo "$a >= $b" || echo "$a < $b" #如果a>=b输出a>=b,否则输出a<b
[fy@localhost 20220514]$ sh 2.sh
16 != 20
16 < 20
16 < 20

      2.字符串运算:

    

    示例:使用test命令对两个字符串比较(等于、非空、小于),注释说明含义。

[fy@localhost 20220514]$ vi 3.sh
[fy@localhost 20220514]$ cat 3.sh
#!/bin/bash
a="feng";b="yan"
test "$a == $b" && echo "'$a' = '$b'" || echo "'$a' != '$b'"  #如果a=b输出a=b,否则输出a!=b
test -n "$a" && echo "'$a' is not null" || echo "'$a' is null" 
#如果a非空输出a is not null,否则输出a is null
test "$a \< $b" && echo "true" || echo "false"  #如果a<b返回真,否则返回假
[fy@localhost 20220514]$ sh 3.sh
'feng' = 'yan'
'feng' is not null
true

      3.文件类型测试: 

    

       4.文件权限和比较测试:

    

t est 命令也可以简写为 [] ,它的用法为: [ expression ]  #注意[]和expression之间的空格,这两个空格是必须的,否则会导致语法错误。 表达式的格式有特别的规定:操作数、运算符及中括号要用空格分隔  

    示例:使用[] 对文件类型、文件权限、文件比较等进行练习。注释说明含义。

[fy@localhost 20220514]$ vi 5.sh
[fy@localhost 20220514]$ cat 5.sh
#!/bin/bash
a="1.sh";b="2.sh"
[ -e "$a" ] && echo "$a:exit" ||"$a:not exit" 
 #如果文件a存在输出a:exit,否则输出a:not exit
[ -r "$a" ] && echo "$a:readable" || "$a:not readable"
 #如果文件a存在且有可读权限时输出a:readable,否则a:not readable
[ "$a" -nt "$b" ] && echo "$a is newer than $b" || echo "$b is newer than $a"
 #如果文件a比文件b新时输出a is newer than b,否则输出b is newer than a
[fy@localhost 20220514]$ sh 5.sh
1.sh:exit
1.sh:readable
2.sh is newer than 1.sh

       5.布尔运算:

    

     示例:使用test命令进行布尔运算,注释说明含义。

[fy@localhost 20220514]$ vi 4.sh
[fy@localhost 20220514]$ cat 4.sh
#!/bin/bash
a=11;b=16
f1="4.sh"
f2="file2"
test $a -gt $b -o $a -eq $b && echo "$a >= $b" || echo "$a < $b"
#如果a>b和a=b任意一个成立输出a>=b,否则输出a<b
test -e "$f1" -a -r "$f1" && echo "$f1 is readable" || echo "$f1 is not exist or not readable"
#如果f1存在且可读 输出f1 is readable,否则输出f1 is not exist or not readable
[fy@localhost 20220514]$ sh 4.sh
11 < 16
4.sh is readable

分支结构

  if-elif结构

  • 从条件表达式1开始检查,执行条件成立时对应的命令
  • 如果所有的表达式都不成立,执行else对应的命令

  结构: 

     

  示例:

      使用if-elif结构完成数字竞猜游戏。需查看脚本内容,并运行。

  case-in结构

    示例:

      结合case-in和函数,完成简易计算器。(选择运算符,再输入数)。

 

 

Shell函数 

  • 函数定义以关键字function开头,后跟函数名和小括号。可以省略function或小括号,但不能同时省略
  • 大括号括起来的部分称为函数体,即调用函数时要执行的命令
  • 使用return语句手动指定函数的返回值或退出码
  • 调用Shell函数时直接使用函数名即可,不需要后跟小括号

         

  基本用法:

  • 调用 Shell 函数时可以给它传递参数,也可以不传递。如果不传递参数,直接给出函数名字即可
  • 调用 Shell 函数时如果传递参数,那么多个参数之间以空格分隔:func_name param1 param2 param3

变量

含义

$0

当前脚本的文件名。

$n(n≥1)

传递给脚本或函数的参数。n 是一个数字,表示第几个参数。例如,第一个参数是 $1,第二个参数是 $2

$#

传递给脚本或函数的参数个数。

$*

传递给脚本或函数的所有参数。

$@

传递给脚本或函数的所有参数。当被双引号“ ”包含时,$@ $* 稍有不同。

$?

上个命令的退出状态,或函数的返回值。

$$

当前 Shell 进程 ID。对于 Shell 脚本,就是这些脚本所在的进程 ID

示例:

    对函数传递参数大于、等于、小于所需参数的三种情形分别试验。 

     

更多推荐

Shell脚本相关命令