shell学习笔记

shell学习笔记

学习视频链接

文章目录

  • shell学习笔记
    • 一、什么是shell
      • 1.shell教程
      • 2.shell脚本
      • 3.shell环境
    • 二、脚本常用的执行方式
      • 1.采用bash或sh+脚本的相对路径或绝对路径(不用赋予脚本+x权限)
        • (1)bash或sh+脚本的相对路径
        • (2)bash或sh+脚本的绝对路径
      • 2.采用输入脚本的绝对路径或相对路径执行脚本(必须具有可执行权限)
        • 1)首先要赋予hello_world.sh 脚本的+x权限
        • 2)执行脚本
          • 相对路径
          • 绝对路径
      • 【了解】第三种:在脚本路径前加上“.”或者“source”
    • 三、变量
      • 1.系统预定义变量
        • 1)常用系统变量
        • 2)案例实操
          • (1)查看系统变量的值
          • (2)显示当前shell中的所有变量:set(env查看系统定义的变量)
      • 2.自定义变量
        • 1)基本语法
        • 2)变量定义规则
        • 3)案例实操
          • (1)定义局部变量
          • (2)提升为全局变量
          • (3)对变量的更改
        • 3)只读变量
      • 3.特殊变量
        • 1)$n
          • (1)基本语法
          • (2)案例实操
        • 2)$#
          • (1)基本语法
          • (2)案例实操
        • 3)$* 、 $@
          • (1)基本语法
          • (2)案例实操
        • 4)$?
          • (1)基本语法
          • (2)案例实操
    • 四、运算符
      • 1、基本语法
      • 2、算术运算符
      • 3、关系运算符
      • 4、布尔运算符
      • 5、逻辑运算符
      • 6、字符串运算符
      • 7、文件测试运算符
    • 五、流程控制
      • 1、if判断
        • 1)基本语法
          • (1)单分支
          • (2)多分支
        • 2)案例实操
      • 2、case语句
        • 1)基本语法
        • 2)案例实操
      • 3、for循环
        • 1)基本语法1
        • 2)案例实操1
        • 3)基本语法2
        • 4)案例实操2
      • 4、while 循环
        • 1)基本语法
        • 2)案例实操
      • 5、until 循环
        • 1)基本语法
        • 2)案例实操
      • 6、跳出循环
        • 1)break命令
        • 2)continue命令
    • 六、read 读取控制台输入
      • 1、基本语法
      • 2、案例实操
    • 七、echo格式化输出
      • 1、echo命令介绍
      • 2、带指定颜色的输出
    • 八、函数
      • 1、系统函数
        • 1)basename
          • (1)基本语法
          • (2)案例实操
        • 2)dirname
          • (1)基本语法
          • (2)案例实操
      • 2、自定义函数
        • 1)基本语法
        • 2)经验技巧
        • 3)案例实操

一、什么是shell

1.shell教程

Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。
Shell 既是一种命令语言,又是一种程序设计语言。
Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务。
Ken Thompson 的 sh 是第一种 Unix Shell,Windows Explorer 是一个典型的图形界面 Shell。

2.shell脚本

Shell 脚本(shell script),是一种为 shell 编写的脚本程序。
业界所说的 shell 通常都是指 shell 脚本,但读者朋友要知道,shell 和 shell script 是两个不同的概念。

3.shell环境

Shell 编程跟 JavaScript、php 编程一样,只要有一个能编写代码的文本编辑器和一个能解释执行的脚本解释器就可以了。
Linux 的 Shell 种类众多,常见的有:

  • Bourne Shell(/usr/bin/sh或/bin/sh)
  • Bourne Again Shell(/bin/bash)
  • C Shell(/usr/bin/csh)
  • K Shell(/usr/bin/ksh)
  • Shell for Root(/sbin/sh)
    ……
    本教程关注的是 Bash,也就是 Bourne Again Shell,由于易用和免费,Bash 在日常工作中被广泛使用。同时,Bash 也是大多数Linux 系统默认的 Shell。
    在一般情况下,人们并不区分 Bourne Shell 和 Bourne Again Shell,所以,像 #!/bin/sh,它同样也可以改为 #!/bin/bash。
    #! 告诉系统其后路径所指定的程序即是解释此脚本文件的 Shell 程序。

二、脚本常用的执行方式

1.采用bash或sh+脚本的相对路径或绝对路径(不用赋予脚本+x权限)

(1)bash或sh+脚本的相对路径
[root@localhost shell]# sh ./hello_world.sh 
Hello World !
(2)bash或sh+脚本的绝对路径
[root@localhost shell]# bash /home/oracle/Desktop/shell/hello_world.sh 
Hello World !

2.采用输入脚本的绝对路径或相对路径执行脚本(必须具有可执行权限)

1)首先要赋予hello_world.sh 脚本的+x权限
[root@localhost shell]# chmod +x hello_world.sh 
2)执行脚本
相对路径
[root@localhost shell]# ./hello_world.sh 
Hello World !
绝对路径
[root@localhost shell]# /home/oracle/Desktop/shell/hello_world.sh 
Hello World !

注意:第一种执行方法,本质是bash解析器帮你执行脚本,所以脚本本身不需要执行权限。第二种执行方法,本质是脚本需要自己执行,所以需要执行权限。

【了解】第三种:在脚本路径前加上“.”或者“source”

[root@localhost shell]# source hello_world.sh 
Hello World !
[root@localhost shell]# . hello_world.sh 
Hello World !

前两种方法都是在当前shell中打开一个子shell来执行脚本内容,当脚本内容结束,则子shell关闭,回到父shell中。
第三种,也就是使用在脚本路径前面加“.”或者“source”的方法,可以使脚本内容在当前shell里执行,而无需打开子shell!这也是为什么我们每次修改完/etc/profile文件以后,需要source一下的原因。
开子shell与不开子shell的区别就在于环境变量的继承关系,如在子shell中设置的当前变量,父shell是不可见的。

三、变量

1.系统预定义变量

1)常用系统变量

$HOME $PWD $SHELL $USER 等

2)案例实操
(1)查看系统变量的值
[root@localhost shell]# echo $HOME
/root
(2)显示当前shell中的所有变量:set(env查看系统定义的变量)
[root@localhost shell]# set | less

2.自定义变量

1)基本语法

(1)定义变量:变量名=变量值,注意:=号前后不能有空格
(2)撤销变量:unset 变量名
(3)声明静态变量:readonly变量,注意:不能unset

2)变量定义规则
  • 命名只能使用英文字母,数字和下划线,首个字符不能以数字开头。
  • 中间不能有空格,可以使用下划线 _。
  • 等号两侧不能有空格。
  • 不能使用标点符号。
  • 不能使用bash里的关键字(可用help命令查看保留关键字)。
  • 变量的值如果有空格,需要使用双引号或单引号括起来。
  • 在bash中,变量默认类型都是字符串类型,无法直接进行数值运算。
3)案例实操
(1)定义局部变量
[root@localhost shell]# my_var='hello world'
[root@localhost shell]# echo $my_var
hello world
(2)提升为全局变量
[root@localhost shell]# export my_var  #用export提升为全局变量
[root@localhost shell]# bash #定义一个子bash
[root@localhost shell]# ps -f
UID         PID   PPID  C STIME TTY          TIME CMD
root      21650  21638  0 14:48 pts/0    00:00:00 -bash
root      32288  21650  0 17:30 pts/0    00:00:00 bash    #此时查看就出现了一个子shell
root      32341  32288  0 17:31 pts/0    00:00:00 ps -f
[root@localhost shell]# echo $my_var  #现在已在子shell中,但是查看变量已能显示。
hello world
(3)对变量的更改
[root@localhost shell]# export my_var  #用export提升为全局变量
[root@localhost shell]# bash #定义一个子bash
[root@localhost shell]# ps -f
UID         PID   PPID  C STIME TTY          TIME CMD
root      21650  21638  0 14:48 pts/0    00:00:00 -bash
root      32288  21650  0 17:30 pts/0    00:00:00 bash    #此时查看就出现了一个子shell
root      32341  32288  0 17:31 pts/0    00:00:00 ps -f
[root@localhost shell]# echo $my_var  #现在已在子shell中,但是查看变量已能显示。
hello world
[root@localhost shell]# my_var='my var is hello world'  #在子shell中重新定义变量值
[root@localhost shell]# echo $my_var
my var is hello world
[root@localhost shell]# exit    #登出子shell,到父shell中
exit
[root@localhost shell]# echo $my_var  
hello world      #此时发现父shell中变量仍然为最开始的变量值,说明变量更改只在当前范围内有效。(在子shell更改的变量值,不作用于父shell中。)
3)只读变量

使用 readonly 命令可以将变量定义为只读变量,只读变量的值不能被改变。

[root@localhost ~]# readonly a=5
[root@localhost ~]# echo $a
5
[root@localhost ~]# a=6
-bash: a: 只读变量

3.特殊变量

1)$n
(1)基本语法

$n (功能描述:n为数字,$0代表该脚本名称,$1-$9代表第一到第九个参数,十以上的参数需要用大括号包含,例如: ${10} )

(2)案例实操
[root@localhost shell]# vim hello.sh   #在里面输入以下脚本
#!/bin/bash
echo '========$n========'
echo script name: $0
echo 1st paramater: $1
echo 2nd paramater: $2
[root@localhost shell]# sh hello.sh 110 120  #运行脚本,脚本后跟上对应参数
========$n========
script name: hello.sh
1st paramater: 110
2nd paramater: 120
2)$#
(1)基本语法

$# (功能描述:获取所有输入参数个数,常用于循环,判断参数的个数是否正确以及加强脚本的健壮性)

(2)案例实操
[root@localhost shell]# vim hello.sh   #在里面输入以下脚本
#!/bin/bash
echo '========$n========'
echo script name: $0
echo 1st paramater: $1
echo 2nd paramater: $2
echo '========$#========'
echo $#
[root@localhost shell]# sh hello.sh 110 120  #运行脚本,脚本后跟上对应参数
========$n========
script name: hello.sh
1st paramater: 110
2nd paramater: 120
========$#========
2
3)$* 、 $@
(1)基本语法

$* (功能描述:这个变量代表命令行中所有的参数, $*把所有的参数看成一个整体 )
以一个单字符串显示所有向脚本传递的参数。
如" $ * “用「”」括起来的情况、以"$1 $2 … $n"的形式输出所有参数。
$@ (功能描述:这个变量也代表命令行中所有的参数,不过 $@把每个参数区分对待)
与 $*相同,但是使用时加引号,并在引号中返回每个参数。
如" $@ “用「”」括起来的情况、以"$1" “$2” … " $n " 的形式输出所有参数。

(2)案例实操
[root@localhost shell]# vim hello.sh   #在里面输入以下脚本
#!/bin/bash
echo '========$n========'
echo script name: $0
echo 1st paramater: $1
echo 2nd paramater: $2
echo '========$#========'
echo paramater numbers:$#
echo '========$*========'
echo $*
echo '========$@========'
echo $@
[root@localhost shell]# sh hello.sh 110 120  #运行脚本,脚本后跟上对应参数
========$n========
script name: hello.sh
1st paramater: 110
2nd paramater: 120
========$#========
paramater numbers: 2
========$*========
110 120
========$@========
110 120
4)$?
(1)基本语法

$? (功能描述:最后一次执行的命令的返回状态,如果这个变量的值为0,证明上一个命令正确执行;如果这个变量的值为非0(具体是哪个数,由命令自己来决定),则证明上一个命令执行不正确。)

(2)案例实操

判断hello.sh脚本正确执行

[root@localhost shell]# echo $?
0
[root@localhost shell]# paramater.sh
bash: paramater.sh: 未找到命令...
[root@localhost shell]# echo $?
127

四、运算符

Shell 和其他编程语言一样,支持多种运算符,包括:

  • 算数运算符
  • 关系运算符
  • 布尔运算符
  • 字符串运算符
  • 文件测试运算符
    原生bash不支持简单的数学运算,但是可以通过其他命令来实现,例如 awk 和 expr,expr 最常用。expr 是一款表达式计算工具,使用它能完成表达式的求值操作。
    例如,两个数相加(注意使用的是反引号 ` 而不是单引号 '):

1、基本语法

“$((运算式))” 或 “ $[运算式]”
实例:

[root@localhost shell]# echo $((3+5))
8
[root@localhost shell]# echo $[3+5]
8

2、算术运算符

下表列出了常用的算术运算符,假定变量 a 为 10,变量 b 为 20:

运算符 说明 举列
+ 加法 expr $a + $b 结果为 30
- 减法 expr $a - $b 结果为 -10
* 乘法 expr $a \* $b 结果为 200
/ 除法 expr $b / $a 结果为 2
% 取余 expr $b % $a 结果为 0
= 赋值 a=$b 把变量 b 的值赋给 a
== 相等。用于比较两个数字,相同则返回 true [ $a == $b ] 返回 false
!= 不相等。用于比较两个数字,不相同则返回 true [ $a != $b ] 返回 true

注意:条件表达式要放在方括号之间,并且要有空格,例如: [$a== $b] 是错误的,必须写成 [ $a == $b ]。
实例:

[root@localhost ~]#vim arithmetic.sh    #在文本里输入以下内容
#!/bin/bash
a=10
b=20
val=`expr $a + $b`
echo "a + b : $val"
val=`expr $a - $b`
echo "a - b : $val"
val=`expr $a \* $b`
echo "a * b : $val"
val=`expr $b / $a`
echo "b / a : $val"
val=`expr $b % $a`
echo "b % a : $val"
[root@localhost ~]#sh arithmetic.sh
a + b : 30
a - b : -10
a * b : 200
b / a : 2
b % a : 0

注意:
乘号( * )前边必须加反斜杠( \ )才能实现乘法运算;
在 MAC 中 shell 的 expr 语法是:$((表达式)),此处表达式中的 " * " 不需要转义符号 " \ " 。

3、关系运算符

关系运算符只支持数字,不支持字符串,除非字符串的值是数字。
下表列出了常用的关系运算符,假定变量 a 为 10,变量 b 为 20:

运算符 说明 举列
-eq 检测两个数是否相等,相等返回 true [ $a -eq $b ] 返回 false
-ne 检测两个数是否不相等,不相等返回 true [ $a -ne $b ] 返回 true
gt 检测左边的数是否大于右边的,如果是,则返回 true [ $a -gt $b ] 返回 false
-lt 检测左边的数是否小于右边的,如果是,则返回 true [ $a -lt $b ] 返回 true
-ge 检测左边的数是否大于等于右边的,如果是,则返回 true [ $a -ge $b ] 返回 false
-le 检测左边的数是否小于等于右边的,如果是,则返回 true [ $a -le $b ] 返回 true

4、布尔运算符

下表列出了常用的布尔运算符,假定变量 a 为 10,变量 b 为 20:

运算符 说明 举列
! 非运算,表达式为 true 则返回 false,否则返回 true [ ! false ] 返回 true
-o 或运算,有一个表达式为 true 则返回 true [ $a -lt 20 -o $b -gt 100 ] 返回 true
-a 与运算,两个表达式都为 true 才返回 true [ $a -lt 20 -a $b -gt 100 ] 返回 false

5、逻辑运算符

以下介绍 Shell 的逻辑运算符,假定变量 a 为 10,变量 b 为 20:

运算符 说明 举列
&& 逻辑的 AND [[ $a -lt 100 && $b -gt 100 ]] 返回 false
ll 逻辑的 OR [[ $a -lt 100 ll $b -gt 100 ]] 返回 true

6、字符串运算符

下表列出了常用的字符串运算符,假定变量 a 为 “abc”,变量 b 为 “efg”:

运算符 说明 举列
= 检测两个字符串是否相等,相等返回 true [ $a = $b ] 返回 false
!= 检测两个字符串是否不相等,不相等返回 true [ $a != $b ] 返回 true
-z 检测字符串长度是否为0,为0返回 true [ -z $a ] 返回 false
-n 检测字符串长度是否不为 0,不为 0 返回 true [ -n “$a” ] 返回 true
$ 检测字符串是否为空,不为空返回 true [ $a ] 返回 true

7、文件测试运算符

文件测试运算符用于检测 Unix 文件的各种属性。
属性检测描述如下:

运算符 说明 举列
-b file 检测文件是否是块设备文件,如果是,则返回 true [ -b $file ] 返回 false。
-c file 检测文件是否是字符设备文件,如果是,则返回 true [ -c $file ] 返回 false。
-d file 检测文件是否是目录,如果是,则返回 true [ -d $file ] 返回 false。
-f file 检测文件是否是普通文件(既不是目录,也不是设备文件),如果是,则返回 true [ -f $file ] 返回 true。
-g file 检测文件是否设置了 SGID 位,如果是,则返回 true [ -g $file ] 返回 false。
-k file 检测文件是否设置了粘着位(Sticky Bit),如果是,则返回 true [ -k $file ] 返回 false。
-p file 检测文件是否是有名管道,如果是,则返回 true [ -p $file ] 返回 false。
-u file 检测文件是否设置了 SUID 位,如果是,则返回 true [ -u $file ] 返回 false。
-r file 检测文件是否可读,如果是,则返回 true [ -r $file ] 返回 true。
-w file 检测文件是否可写,如果是,则返回 true [ -w $file ] 返回 true。
-x file 检测文件是否可执行,如果是,则返回 true [ -x $file ] 返回 true。
-s file 检测文件是否为空(文件大小是否大于0),不为空返回 true [ -s $file ] 返回 true。
-e file 检测文件(包括目录)是否存在,如果是,则返回 true [ -e $file ] 返回 true。

其他检查符:
-S: 判断某文件是否 socket。
-L: 检测文件是否存在并且是一个符号链接。

条件判断语法:
(1)test condition
(2)[ condition ] (注意condition前后要有空格)
注意:条件非空即为true,[ atguigu ] 返回true,[ ] 返回false。

[root@localhost shell]# a=521
[root@localhost shell]# echo $a
521
[root@localhost shell]# test $a = 521
[root@localhost shell]# echo $?
0
[root@localhost shell]# test $a = 520
[root@localhost shell]# echo $?
1
[root@localhost shell]# [ $a = 521 ]
[root@localhost shell]# echo $?
0
[root@localhost shell]# [ $a = 520 ]
[root@localhost shell]# echo $?
1

五、流程控制

1、if判断

1)基本语法
(1)单分支
if [ 条件判断式 ];then
程序
fi

或者

if [ 条件判断式 ]
then
程序
fi
(2)多分支
if [ 条件判断式 ]
then
程序
elif [ 条件判断式 ]
then
程序
else
程序
fi

注意事项:

  1. [ 条件判断式 ],中括号和条件判断式之间必须有空格
  2. if后要有空格
2)案例实操
[root@localhost shell]# vim if_test.sh   #在脚本文件里输入以下内容
#!/bin/bash
if [ "$1"x = "atguigu"x ]
then
     echo "welcome to, atguigu"
fi
[root@localhost shell]# sh if_test.sh atguigu  #执行脚本,输出内容。但后面内容不是“atguigu”,则不输出内容
welcome to, atguigu
[root@localhost shell]# a=20
[root@localhost shell]# if [ $a -gt 18 ] && [ $a -lt 35 ];then echo OK; fi
OK
[root@localhost shell]# if [ $a -gt 18 -a $a -lt 35 ];then echo OK; fi
OK                       #此处-a是逻辑与的表达式,相当于and;-o为逻辑或,相当于or.
[root@localhost shell]# vim if_else.sh   #在脚本文件里输入以下内容
#!/bin/bash
a=10
b=20
if [ $a == $b ]
then
   echo "a 等于 b"
elif [ $a -gt $b ]
then
   echo "a 大于 b"
elif [ $a -lt $b ]
then
   echo "a 小于 b"
else
   echo "没有符合的条件"
fi
[root@localhost shell]# sh if_else.sh  #执行脚本,得出结果
a 小于 b

2、case语句

1)基本语法

case $变量名 in
“值1”)
如果变量的值等于值1,则执行程序1
;;
“值2”)
如果变量的值等于值2,则执行程序2
;;
…省略其他分支…
*)
如果变量的值都不是以上的值,则执行此程序
;;
esac

*注意事项:

  1. case行尾必须为单词“in”,每一个模式匹配必须以右括号“)”结束。
  2. 双分号“;;”表示命令序列结束,相当于Java中的break。
  3. 最后的“)”表示默认模式,相当于Java中的default。
2)案例实操

下面的脚本提示输入 1 到 4,与每一种模式进行匹配:

[root@localhost shell]# vim case_esac.sh    在脚本文件里输入#!到esac以下的内容
#!/bin/bash
echo '输入 1 到 4 之间的数字:'
echo '你输入的数字为:'
read aNum
case $aNum in
    1)  echo '你输入的是 1'
    ;;
    2)  echo '你输入的是 2'
    ;;
    3)  echo '你输入的是 3'
    ;;
    4)  echo '你输入的是 4'
    ;;
    *)  echo '你没有输入 1 到 4 之间的数字'
    ;;
esac
[root@localhost shell]# sh case_esac.sh    #执行脚本
输入 14 之间的数字:
你输入的数字为:
3
你输入的是 3

3、for循环

1)基本语法1

for (( 初始值;循环控制条件;变量变化 ))
do
程序
done

2)案例实操1

从1加到100

[root@localhost shell]# vim for.sh   
#!/bin/bash
sum=0
for ((i=0;i<=100;i++))  #双小括号下可以用数学上的一些符号,运算式
do
        sum=$[ $sum+$i ]
done
echo $sum
[root@localhost shell]# sh for.sh 
5050
3)基本语法2

for 变量 in 值1 值2 值3
do
程序
done

4)案例实操2
  1. 顺序输出当前列表中的数字:
[root@localhost shell]# vim shell_for_more.sh 
#!/bin/bash
for loop in 1 2 3 4 5 6
do
   echo "The value is : $loop"
done
[root@localhost shell]# sh shell_for_more.sh 
The value is : 1
The value is : 2
The value is : 3
The value is : 4
The value is : 5
The value is : 6
[root@localhost shell]# for i in {1..100}; do sum=$[$sum+$i]; done; echo $sum
5050   #从1加到100
  1. 比较$* 和 $@区别
    $* 和 $@都表示传递给函数或脚本的所有参数,不被双引号“”包含时,都以$1$2… $n的形式输出所有参数。
[root@localhost shell]# vim for2.sh
#!/bin/bash
echo '========$*========'
for i in $*
do
        echo "1 2 3 $i"
done

echo '========$@========'
for j in $@
do
        echo "1 2 3 $j"
done
[root@localhost shell]# sh for2.sh 4 5 6
========$*========
1 2 3 4
1 2 3 5
1 2 3 6
========$@========
1 2 3 4
1 2 3 5
1 2 3 6
#当它们被双引号“”包含时,$*会将所有的参数作为一个整体,以“$1 $2 ... $n”的形式输出所有参数;$@会将各个参数分开,以“$1” “$2” ... “$n”的形式输出所有参数。
[root@localhost shell]# vim for2.sh
#!/bin/bash
echo '========$*========'
for i in "$*"
do
        echo "1 2 3 $i"
done
#$*中的所有参数看成是一个整体,所以这个for循环只会循环一次
echo '========$@========'
for j in "$@"
do
        echo "1 2 3 $j"
done
#$@中的每个参数都看成是独立的,所以“$@”中有几个参数,就会循环几次
[root@localhost shell]# sh for2.sh 4 5 6
========$*========
1 2 3 4 5 6
========$@========
1 2 3 4
1 2 3 5
1 2 3 6

4、while 循环

1)基本语法

while [ 条件判断式 ]
do
程序
done

2)案例实操

从1加到100

[root@localhost shell]# vim for.sh 编辑for脚本,在下面添加以下内容
#用while循环实现
a=1
while [ $a -le 100 ]
do
        sum2=$[ $sum2 + $a ]
        a=$[$a + 1]
done
echo $sum2
[root@localhost shell]# sh for.sh
5050
5050

5、until 循环

until 循环执行一系列命令直至条件为 true 时停止。

until 循环与 while 循环在处理方式上刚好相反。

一般 while 循环优于 until 循环,但在某些时候—也只是极少数情况下,until 循环更加有用。

1)基本语法

until [ 条件判断式 ]
do
程序
done

2)案例实操

以下实例我们使用 until 命令来输出 0 ~ 9 的数字:

[root@localhost shell]# vim until.sh
#!/bin/bash
a=0
until [ ! $a -lt 10 ]
do
   echo $a
   a=`expr $a + 1`
done
[root@localhost shell]# sh until.sh
0
1
2
3
4
5
6
7
8
9

6、跳出循环

1)break命令

下面的例子中,脚本进入死循环直至用户输入数字大于5。要跳出这个循环,返回到shell提示符下,需要使用break命令。

[root@localhost shell]# vim break.sh
#!/bin/bash
while :
do
    echo -n "输入 1 到 5 之间的数字:"
    read aNum
    case $aNum in
        1|2|3|4|5) echo "你输入的数字为 $aNum!"
        ;;
        *) echo "你输入的数字不是 1 到 5 之间的! 游戏结束"
            break
        ;;
    esac
done
[root@localhost shell]# sh break.sh
输入 15 之间的数字:3
你输入的数字为 3!
输入 15 之间的数字:7
你输入的数字不是 15 之间的! 游戏结束
2)continue命令

continue命令与break命令类似,只有一点差别,它不会跳出所有循环,仅仅跳出当前循环。
对上面的例子进行修改:

#!/bin/bash
while :
do
    echo -n "输入 1 到 5 之间的数字: "
    read aNum
    case $aNum in
        1|2|3|4|5) echo "你输入的数字为 $aNum!"
        ;;
        *) echo "你输入的数字不是 1 到 5 之间的!"
            continue
            echo "游戏结束"
        ;;
    esac
done

运行代码发现,当输入大于5的数字时,该例中的循环不会结束,语句 echo “游戏结束” 永远不会被执行。

六、read 读取控制台输入

1、基本语法

read (选项) (参数)

  1. 选项
    -p: 指定读取时的提示符
    -t::指定读取值时等待的时间(秒)如果-t不加表示一直等待
    -s:不回显
    -n:输入字符个数
  2. 参数
    变量:指定读取值的变量名

2、案例实操

[root@localhost shell]# vim read.sh
#!/bin/bash
read -t 10 -p "请输入你的名字:" name
echo "welcome to $name"
[root@localhost shell]# sh read.sh
请输入你的名字:china
welcome to china

七、echo格式化输出

1、echo命令介绍

一个程序需要有0个或以上输入,一个或更多输出

功能:将内容输出到默认显示设备
echo命令的功能是在显示器上显示一段文字,一般起到一个提示的作用。功能说明:显示文字。语法:echo [-ne][字符串]
补充说明:echo会将输入的字符串送往标准输出。输出的字符串间以空白字符隔开,并在最后加上换行号。

命令选项;
-n不要在最后自动换行
-e若字符串中出现以下字符,则特别加以处理,而不会将它当成一般文字输出;转义字符
\a发出警告声;
\b删除前一个字符;
\c最后不加上换行符号;
\f换行但光标仍旧停留在原来的位置;ln换行且光标移至行首;
\r光标移至行首,但不换行;
\t插入tab;
\w与Mf相同;
\插入I字符;
\nnn插入nnn(八进制)所代表的ASCII字符;
-help显示帮助
-version显示版本信息

#输出9-1的倒计时
[root@localhost shell]# cat time.sh
#!/bin/bash
for time in `seq 9 -1 0`;do
echo -n -e  "\b$time"
sleep 1
done
echo

2、带指定颜色的输出

脚本中echo显示内容带颜色显示,echo显示带颜色,需要使用参数-e格式如下:
echo -e “\033[背景色;字体颜色 字符串 \033[属性效果”
例如;
echo -e “\033[41;36m something here \033[0m”
其中41的位置代表底色,36的位置是代表字的颜色
1、字背景颜色和文字颜色之间是英文的""
2、文字颜色后面有个m
3、字符串前后可以没有空格,如果有的话,输出也是同样有空格

下面是相应的字和背景颜色,可以自己来尝试找出不同颜色搭配
例:
echo -e “\033[31m 红色字 \033[0m"
echo -e “\033[34m 黄色字 \033[0m”
echo -e “\033[41;33m 红底黄字 \033[0m”
echo -e “\033[41;37m 红底白字 \033[0m”

字颜色:30–37
echo -e “\033[30m 黑色字 \033[0m”
echo -e “\033[31m 红色字 \033[0m"
echo -e “\033[32m 绿色字 \033[0m”
echo -e “\033[33m 黄色字 \033[0m”
echo -e “\033[34m 蓝色字 \033[0m"
echo -e “\033[35m 紫色字 \033[0m”
echo -e “\033[36m 天蓝字 \033[0m”
echo -e “\033[37m 白色字 \033[0m”

字背景颜色范围:40–47
echo -e “\033[40;37m 黑底白字 \033[0m”
echo -e “\033[41;37m 红底白字 \033[0m”
echo -e “\033[42;37m 绿底白字 \033[0m”
echo -e “\033[43;37m 黄底白字 \033[0m”
echo -e “\033[44;37m 蓝底白字 \033[0m”
echo -e “\033[45;37m 紫底白字 \033[0m”
echo -e “\033[46;37m 天蓝底白字 \033[0m”
echo -e “\033[47;30m 白底黑字 \033[0m”

最后面控制选项说明
\033[0m 关闭所有属性
\033[1m 设置高亮度
\033[4m 下划线
\033[5m 闪烁
\033[7m 反显
\033[8m 消隐
\033[30m - \33[37m

设置前景色
\033[40m - \33[47m 设置背景色
\033[nA 光标上移n行
\033[nB 光标下移n行
\033[nC 光标右移n行
\033[nD 光标左移n行
\033[y;xH 设置光标位置
\033[23 清屏
\033[K 清除从光标到行尾的内容
\33[s 保存光标位置
\033[u 恢复光标位置
\033[?251 隐藏光标
\033[?25h 显示光标

八、函数

1、系统函数

1)basename
(1)基本语法

basename [ string / pathname ] [ suffix ]
(功能描述:basename命令会删掉所有的前缀包含最后一个(‘/’)字符,然后将字符串显示出来。)
basename可以理解为取路径里的文件名称。
选项
suffix为后缀,如果suffix被指定了,basename会被pathname或string中的suffix去掉。

(2)案例实操
[root@localhost shell]# vim hello.sh 
#!/bin/bash
echo '========$n========'
echo script name: $(basename $0 .sh)  #获取路径中的文件名称
echo 1st paramater: $1
echo 2nd paramater: $2
echo '========$#========'
echo paramater numbers: $#
echo '========$*========'
echo "$*"
echo '========$@========'
echo "$@"      
[root@localhost shell]# /home/oracle/Desktop/shell/hello.sh 1 2
========$n========
script name: hello
1st paramater: 1
2nd paramater: 2
========$#========
paramater numbers: 2
========$*========
1 2
========$@========
1 2

2)dirname
(1)基本语法

dirname 文件绝对路径 (功能描述:从给定的包含绝对路径的文件名中去除文件名(非目录的部分),然后返回剩下的路径(目录的部分))
dirname 可以理解为取文件路径的绝对路径的部分

(2)案例实操
[root@localhost shell]# vim hello.sh 
#!/bin/bash
echo '========$n========'
echo script name: $(basename $0 .sh)  #获取路径中的文件名称
echo script path: $(cd $(dirname $0); pwd)  
echo 1st paramater: $1
echo 2nd paramater: $2
echo '========$#========'
echo paramater numbers: $#
echo '========$*========'
echo "$*"
echo '========$@========'
echo "$@"      
[root@localhost shell]# cd ../../
[root@localhost oracle]# ../../home/oracle/Desktop/shell/hello.sh 1 2
========$n========
script name: hello
script path: /home/oracle/Desktop/shell
1st paramater:1
2nd paramater:2
========$#========
paramater numbers: 2
========$*========
1 2
========$@========
1 2

2、自定义函数

1)基本语法
[ function ] funname[()]
{
	Action
	[return int;]
}
2)经验技巧
  1. 必须在调用函数地方之前,先声明函数,shell脚本是逐行运行。不会像其他语言一样先编译。
  2. 函数返回值,只能通过$?系统变量获取,可以显示加:return返回,如果不加,将以最后一条命令运行结果,作为返回值。return后跟数值n(0-255)。
3)案例实操

输入两个数字进行求和

[root@localhost shell]# vim fun_test.sh 
#!/bin/bash
function add(){
        s=$[$1+$2]
        echo $s
}
read -t 30 -p "请输入第一个整数:" a
read -t 30 -p "请输入第二个整数:" b
sum=$(add $a $b)
echo "和:"$sum
[root@localhost shell]# sh fun_test.sh 
请输入第一个整数:34
请输入第二个整数:12
和:46

返回首页

你可能感兴趣的:(学习,bash,linux)