shell脚本

本文介绍了Shell脚本的基础知识,包括什么是Shell,脚本的调用方式,如通过/etc/profile或~/.bashrc,以及脚本的开头#!/bin/bash。详细讲解了Shell的变量、字符串、数组、注释、参数传递、运算符(算术、关系、逻辑、字符串、文件测试)以及流程控制语句(if、for、while、case、select)。内容适合初学者了解和学习Shell编程。
摘要由CSDN通过智能技术生成

shell是用户跟内核通信的几种方式中的一种

文章目录

目录

文章目录

前言

一、shell是什么?

二、脚本的调用方式

1.打开终端时系统自动调用:etc/profile或~/.hashrc

2.shell初识

2.1 定义开头:#! /bin/bash

3.shell基础语法

3.1 shell变量

3.2 shell字符串

3.3 shell数组

3.4 shell的注释

3.5 shell参数传递

3.6 shell 运算符

3.6.1 算术运算符

3.6.2 关系(比较)运算符

3.6.3 逻辑运算符

3.6.4 字符串运算符

3.6.5 文件测试运算符 

 4 shell 编程流程控制语句

4.1 if条件语句

4.1.1 常用的单分支和双分支

4.2 for循环语句

4.3 while循环语句

4.4 case选择语句

4.5 select选择语句

4.6 shell函数

总结


前言

Shell脚本的编写和其它脚本语言编写程序很像,也支持变量、数组、条件选择、循环、函数、模块化等功能语法。这篇文章就对Shell脚本的一些基础的格式与使用方法进行介绍。


一、shell是什么?

        shell是一种脚本语言,本质上是一个文本文件,里面存放特定格式的指令,系统可以使用脚本解析器 翻译或者解析指令并执行他(不需编译) shell既是应用程序又是一种脚本语言 简而言之 shell 本质上是 linux 命令,一条一条命令组合在一起,实现某一个目的,就变成了shell脚本。它从一定程度上 减轻了工作量,提高了工作效率。

二、脚本的调用方式

1.打开终端时系统自动调用:etc/profile或~/.hashrc

/etc/profile
此文件为系统的每个用户设置环境信息,当用户第一次登录时,该文件被执行,系统的公共环境变量在这里设置
开机自启动的程序,一般也在这里设置
~/.bashrc
用户自己的家目录中的.bashrc
登录时会自动调用,打开任意终端时也会自动调用
这个文件一般设置与个人用户有关的环境变量,如交叉编译器的路径等等
用户手动调用:用户实现的脚本

 ./  , sh , source 三个命令都可以执行helloworld.sh脚本下面看一下他们的不同

首先./ 和 sh 不能执行没有权限的脚本 source却可以 另外当声明一些变量时只有source可以得到变量值 

2.shell初识

2.1 定义开头:#! /bin/bash

#!用来声明脚本由什么shell解释,否则使用默认shell,单个#表示注释当前行

编写第一个shell脚本helloworld.sh

vim helloworld.sh

#! /bin/bash

echo "hello world!"

chmod ug+x helloworld.sh

./helloworld.sh

sh helloworld.sh

source helloworld.sh

 #./  , sh , source 三个命令都可以执行helloworld.sh脚本下面看一下他们的不同

#首先./ 和 sh 不能执行没有权限的脚本 source却可以 另外当声明一些变量时只有source可以得到变量值 
[root@VM-4-13-centos local]# uname=admin
[root@VM-4-13-centos local]# echo $uname
admin
[root@VM-4-13-centos local]# vim helloworld.sh 

#! /bin/bash

echo "hello! world!"
echo $uname

[root@VM-4-13-centos local]# ./helloworld.sh 
hello! world!

[root@VM-4-13-centos local]# sh helloworld.sh 
hello! world!

[root@VM-4-13-centos local]# source helloworld.sh 
hello! world!
admin
[root@VM-4-13-centos local]# 

 要想 ./ 和 sh 也得到变量值 可以使用 export         加了export子进程就能使用这个变量 因为./ 和 sh两种方式都是 声明和执行 分开不同的两个进程 不同进程一般条件下不能共享变量 

[root@VM-4-13-centos local]# export age=66
[root@VM-4-13-centos local]# vim helloworld.sh 

#! /bin/bash

echo "hello! world!"
echo $uname
echo $age


[root@VM-4-13-centos local]# ./helloworld.sh 
hello! world!

66
[root@VM-4-13-centos local]# sh helloworld.sh 
hello! world!

66
[root@VM-4-13-centos local]# source helloworld.sh 
hello! world!
admin
66

3.shell基础语法

3.1 shell变量

  • 定义变量不能加$ 调用变量时必须加$
    • 只能使用英文字母,数字加下划线 首位不能是数字
    • 中间不能有空格 可以使用下划线
    • 不能使用标点符号
    • 不能使用bash里的关键字(可以使用help命令查看保留关键字)
  • 变量类型
    • 局部变量
      • 局部变量在脚本或命令中定义,仅在当前的shell实例中有效,其他shell启动的程序不能访问该局部变量
    • 环境变量
      • 所有程序中包括shell启动的程序,都能访问该变量,有些程序需要环境变量才能正常运行
    • shell变量
      • shell变量是哟shell程序设置的特殊变量 shell变量中有一部分是环境变量有一部分是局部变量

#变量的声明
name="zhangsan"

for file in 'ls /etc'
或
for file in $(ls /etc)

#变量的调用

echo $name
echo ${name}

for skill in Ada Coffe Action Java; do
    echo "I am good at ${skill}Script"
done

# 只读变量 /bi/bash: NAME: This variable is read only 不能删除
url="https://www.google.com"
readonly url
url="https://www.runoob.com"

#删除变量
unset name

3.2 shell字符串

  • 字符串是shell编程中最常用最有用的数据类型 字符串可以加单引号也可以加双引号,也可以不加引号 
  • 加单引号
    • 单引号里的任何字符都会原样输出,引用单引号字符串中的变量是无效的;
    • 单引号字符串中不能出现单独一个的单引号 可成对出现作为字符串拼接使用
  • 双引号
    • 双引号里可以有变量
    • 双引号里可以有转义字符
# 声明字符串
str1="hello world 1"
str2='hello world 2'

# 字符串拼接--双引号
name='zhangsan'
name1="hello, "$name"!"
name2="hello, ${name}!"

# 字符串拼接 单引号
passwd0='123456'
passwd1='hello,"$passwd0"!'
passwd2='hello, ${passwd0}!'
echo $passwd2 # hello,${passwd0}!

# 字符串的长度
email="123456@qq.com"
echo ${#email}
echo ${email:1:4}# 1 开始下标 4 步长

3.3 shell数组

  • bash支持一维数组(不支持多维数组),并且没有限制数组的大小
  • 数组元素下标由0开始, 获取数组下标中的元素要利用下标, 下标可以是整数或算数表达式 其值应大于等于0
# 定义数组 括号来表示数组 数组元素用空格分开
# 数组名=(元素0 元素1 元素2 元素3...)
favs=("足球" "篮球" "乒乓球" "保龄球") 

# 读取数组${数组名[下标]}
fav=${favs[1]}

# 使用@获取所有元素
echo ${favs[@]}

# 获取数组的长度
length1=${#favs[@]}
length2=${#favs[*]}

3.4 shell的注释

  • 以#开头的行就是注释 会被解释器忽略
  • 通过每一行加一个#设置多行注释
#-----------------
# 这是一个注释
# author:
# site:
#-----------------
#### 服务器配置 start####
#
#
#
#### 服务器配置 end ####


# 特殊的多行注释
:<<EOF
注释内容.....
注释内容.....
注释内容.....
注释内容.....
注释内容.....
EOF

:<<!
注释内容.....
注释内容.....
注释内容.....
注释内容.....
注释内容.....
!

3.5 shell参数传递

  • 执行Shell脚本时 向脚本传递参数 脚本获取参数的格式为 $n n代表一个数字
    • 参数处理参数说明
      $#传递到脚本的参数个数 
      $*以一个单字符串显示所有向脚本传递的参数 
      $$脚本运行当前进程的ID号
      $!后台运行的最后一个进程的id号
      $?显示最后命令的退出状态 0表示没有错误 其他任何值表示有错误
      $0执行的文件名
      #! /bin/bash
      
      echo "shell 传递参数实例!";
      echo"执行的文件名: $0";
      echo"第一个参数为: $1";
      echo"第一个参数为: $2";
      echo"第一个参数为: $3";
      
      
      #./hello.sh 11 22 33 44

3.6 shell 运算符

Bash 支持很多运算符,其中包括:

        - 算数运算符

        - 关系(比较)运算符

        - 逻辑运算符

        - 字符串运算符

        - 文件测试运算符

3.6.1 算术运算符

  • expr 是一款表达式计算工具 使用它能完成表达式的求值操作.
    • 以下几点需要注意:
    • 1.表达式和运算符之间要有空格。
      例如: 5+10 是不对的,必须写成 5 + 10,这与我们熟悉的大多数编程语言不一样。

      2.完整的表达式要被 ` ` 包含,注意这个字符不是常用的单引号,在 Esc 键下边。

      3.乘号(*)前边必须加反斜杠(\)进行转义才能实现乘法运算。

  • # 算术运算符
    #!/bin/bash
    
    a=10
    b=20
    
    result=`expr $a + $b`
    echo "a + b = $result"
    
    result=`expr $a - $b`
    echo "a - b = $result"
    
    result=`expr $a \* $b`
    echo "a * b = $result"
    
    result=`expr $b / $a`
    echo " b / a = $result"
    
    result=`expr $b % $a`
    echo "b % a = $result"
    
    #a + b = 30
    #a - b = -10
    #a * b = 200
    #b / a = 2
    #b % a = 0
    
    算术运算符说明举例
    +加法expr $a + $b 结果为30
    -减法expr $a - $b 结果为-10
    *乘法expr $a \* $b 结果为200
    /除法expr $b / $2 结果为2
    %取余expr $b % $a 结果为0
    =赋值a=$b 把变量b的值赋值给变量a
    ==相等。判断两个数字是否相等,相等则返回true[ $a == $b ] 返回true
    !=不相等。判断两个数字是否相等,不相等则返回true[ $a != $b ] 返回true

3.6.2 关系(比较)运算符

在[]中使用的比较符在(()和[[]]}中使用的比较符说明举例
-eq==equal的缩写,表相等[ $a -eq $b ] 返回 false
-ne!=not equal的缩写,表不相等[ $a -nq $b ] 返回 true
-gt>greater thanl的缩写,表大于[ $a -gt $b ] 返回 false
-ge>=greater equal的缩写,表大于等于[ $a -ge $b ] 返回 false
-lt<less than的缩写,表小于[ $a -lt $b ] 返回 true
-le<=less equal的缩写,表小于等于[ $a -lq $b ] 返回 true

 提示:
1. "<"符号意思是小于,要麽:if [[ "$a" <  "$b" ]] 是错误的,要麽:if [ "$a"  \<  "$b" ] (即在单[]中需要转义,因为shell也用 <和>表示重定向)。
2. ">"符号意思是大于,要麽:if [[ "$a" >  "$b" ]] 是错误的,要麽:if [ "$a"  \> "$b" ] (即在单[]中需要转义,因为shell也用 <和>表示重定向)。
3. 关系运算符只支持数字(整数),不支持字符串,除非字符串的值是数字(整数)。
4. 条件表达式要放在方括号之间,并且要有空格,例如 [[$a==$b]] 是错误的,必须写成 [[ $a == $b ]]。

#!/bin/bash

#created by yuki on 20180723
#this script is used for doing ......

a=5
b=10

if [ $a -eq $b ]
then
	echo "eq 关系运算结果: a等于b"
else
	echo "eq 关系运算结果: a不等于b"
fi


if [ $a -ne $b ]
then 
	echo "ne 关系运算结果: a不等于b"
else
	echo "ne 关系运算结果: a等于b"
fi


if [ $a -gt $b ]
then
	echo "gt 关系运算结果: a大于b"
else
	echo "gt 关系运算结果: a小于等于b"
fi


if [ $a -lt $b ]
then
	echo "lt 关系运算结果:a小于b"
else
	echo "lt 关系运算结果:a大于等于b"
fi


if [ $a -ge $b ]
then
	echo "ge 关系运算结果:a大于等于b"
else
	echo "ge 关系运算结果:a小于b"
fi


if [ $a -le $b ]
then
	echo "le 关系运算结果:a小于等于b"
else 
	echo "le 关系运算结果:a大于b"
fi

结果

eq 关系运算结果: a不等于b
ne 关系运算结果: a不等于b
gt 关系运算结果: a小于等于b
lt 关系运算结果:a小于b
ge 关系运算结果:a小于b
le 关系运算结果:a小于等于b

3.6.3 逻辑运算符

在[ ]中使用的比较符在(()和[[]]}中使用的比较符说明举例
赋值a=10b=25
-a&&与运算,两个表达式都为true,才返回true[ $a -lt 20 -a $b -gt 20 ] 返回true
-o||或运算,有一个表达式都为true,则返回true[ $a -lt 20 -o $b -gt 100 ] 返回true
!!非运算,表达式为true,则返回false[ ! false ] 返回true

小结:逻辑操作符使用总结
[ ]中用 -a,-o, !
[[ ]]中用 &&,||, !
test 用法和 [ ]相同

#!/bin/bash

#created by yuki on 20180723
#this script is used for doing ......

a=5
b=10


if [ $a != $b ]
then
	echo "!= 逻辑非运算结果:a不等于b"
else 
	echo "!=逻辑非运算结果: a等于b"
fi

if [ $a -lt 50 -a  $b -gt 8 ]
then
	echo "and 逻辑与运算结果:真"
else
	echo "and 逻辑与运算结果:假"
fi


if [ $a -lt 50 -o $b -gt 12 ]
then
	echo "or 逻辑或运算结果:真"
else
	echo "or 逻辑或运算结果:假"
fi

if [ $a -lt 3 -o $b -gt 8 ]
then
	echo "or 逻辑或运算结果:真"
else
	echo "or 逻辑或运算结果:假"
fi
!= 逻辑非运算结果:a不等于b
and 逻辑与运算结果:真
or 逻辑或运算结果:真
or 逻辑或运算结果:真

3.6.4 字符串运算符

字符串运算符说明举例
=检测两个字符串是否相等,相等则返回true[ $a = $b ] 返回true
!=检测两个字符串是否相等,不相等则返回true[ $a != $b ] 返回true
-z检测字符串长度是否为0,为0则返回true[ -z $b ] 返回true
-n检测字符串长度是否为0,不为0则返回true[ -n $b ] 返回true
str检测字符串是否为null,不为null则返回true[ $b ] 返回true

#经测试:
字符串比较用单等号或双等号都可以,而且外边的中括号最好是用双中括号,这样结果比较准确。

[root@myhost ~]# string="abcde"
[root@myhost ~]# if [[ "$string" == abc* ]]; then  echo "abc开头"; else echo "不是"; fi
abc开头
[root@myhost ~]# if [ "$string" == abc* ]; then  echo "abc开头"; else echo "不是"; fi
不是
[root@myhost ~]# if [ "$string" = abc* ]; then  echo "abc开头"; else echo "不是"; fi
不是
[root@myhost ~]# if [[ "$string" = abc* ]]; then  echo "abc开头"; else echo "不是"; fi
abc开头

[root@myhost ~]# string="abcde"
[root@myhost ~]# if [[ "$string" = "abc*" ]]; then  echo "不相等"; else echo "不等"; fi
不等
[root@myhost ~]# if [[ "$string" == "abc*" ]]; then  echo "不相等"; else echo "不等"; fi
不等
[root@myhost ~]# if [ "$string" == "abc*" ]; then  echo "不相等"; else echo "不等"; fi
不等
[root@myhost ~]# if [ "$string" = "abc*" ]; then  echo "不相等"; else echo "不等"; fi
不等


#!/bin/bash

#created by yuki on 20180723
#this script is used for doing ......

a="cfe"
b="efr"

if [ "$a" = "$b" ]
then 
	echo "字符串a和字符串b相等"
else
	echo "字符串a和字符串b不相等"
fi

if [ "$a" == "$b" ]
then 
	echo "字符串a和字符串b相等"
else
	echo "字符串a和字符串b不相等"
fi

[root@myhost ~]# a="cfe"
[root@myhost ~]# b="efr"
[root@myhost ~]# if [ "$a" =="$b" ]
> then 


############## end ####################################

if [ "$a" != "$b" ]
then
	echo "字符串a和字符串b不相等"
else
	echo "字符串a和字符串b相等"
fi

if [ -z "$a" ]
then
	echo "字符串a的长度为0,即字符串a为空?"
else
	echo "字符串a的长度不为0"
fi 

if [ -n "$a" ]
then
	echo "字符串a的长度不为0"
else
	echo "字符串a的长度为0,即字符串a为空?"
fi

if [ "$a" ]
then
	echo "字符串a不为空"
else
	echo "字符串不为空"
fi
字符串a和字符串b不相等
字符串a的长度不为0
字符串a的长度不为0
字符串a不为空

3.6.5 文件测试运算符 

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

 文件测试运算符用于检测 Unix 文件的各种属性,-a已经被弃用了。

 例如,变量 file 表示文件“ /etc/rc.d/rc.local”,它的大小为220kb,所有者root用户具有 rwx 权限。

[root@myhost ~]# ll /etc/rc.d/rc.local
-rwxr-xr-x 1 root root 220 Oct  4  2017 /etc/rc.d/rc.local

下面的代码,将检测该文件的各种属性:

#!/bin/bash

#created by yuki on 20180723
#this script is used for doing ......

file="/etc/rc.d/rc.local"

if [ -e $file ]
then
	echo "这个已经存在"
else
	echo "这个不存在"
fi


if [ -r $file ]
then
	echo "当前用户可读此文件"
else
	echo "当前用户没有读此文件的权限"
fi

if [ -w $file ]
then
	echo "当前用户可写此文件"
else 
	echo "当前用户没有写此文件的权限"
fi

if [ -x $file ]
then
	echo "当前用户可以执行此文件"
else
	echo "当前用户没有执行此文件的权限"
fi

if [ -d $file ]
then
	echo "这个是目录"
else	
	echo "这个不是目录"
fi

if [ -f $file ]
then
	echo "这个是普通文件"
else
	echo "这个不是普通文件"
fi

if [ -s $file ]
then
	echo "此文件大小不为0"
else
	echo "此文件大小为0,即文件内容为空"
fi
这个已经存在
当前用户可读此文件
当前用户可写此文件
当前用户可以执行此文件
这个不是目录
这个是普通文件
此文件大小不为0

 4 shell 编程流程控制语句

4.1 if条件语句

4.1.1 常用的单分支和双分支

if条件语句 可以与逻辑运算符一起使用 上面的例子已经使用过了

# If条件判断语句,通常以if开头,fi结尾。也可加入else或者elif进行多条件的判断

# 单分支语句 ---比较大小
	if (条件表达式);then
		语句1
	fi

# 双分支if 语句
	if (表达式)
		语句1
	else
		语句2
	fi

# 多支条件语句 ---判断成绩
	if (表达式)
		语句1
	elif
		语句2
	elif
		语句2
	fi  


-f	 	判断文件是否存在 eg: if [ -f filename ];
-d	 	判断目录是否存在 eg: if [ -d dir     ];
-eq		等于,应用于整型比较 equal;
-ne		不等于,应用于整型比较 not equal;
-lt		小于,应用于整型比较 letter;
-gt		大于,应用于整型比较 greater;
-le		小于或等于,应用于整型比较;
-ge 	大于或等于,应用于整型比较;
-a		双方都成立(and) 逻辑表达式 –a 逻辑表达式;
-o		单方成立(or) 逻辑表达式 –o 逻辑表达式;
-z		空字符串;
-x      是否具有可执行权限
||      单方成立;
&&      双方都成立表达式。

 使用单分支判断crond服务是否在运行

#!/bin/bash
# this is check crond
# by author rivers on 2021-9.23

# 定义一个变量名
name=crond
num=$(ps -ef|grep $name|grep -vc grep)
if [ $num -eq 1 ];then
    echo "$num running!"
else
    echo "$num is not running!"
fi

判断目录 是否存在

#!/bin/bash
# this is check directory 
# by author rivers on 2021-9.27 
 if  [  !  -d  /data/rivers  -a  !  -d  /tmp/rivers  ];then
 mkdir  -p  /data/rivers  f
 i

 多条件判断学生成绩

# if 语句可以直接对命令状态进行判断,就省去了获取$?这一步!
  # 如果第一个条件符合就不再向下匹配
#!/bin/bash
  # this check grade shell
  # by author rivers on 2021-09-27
  
  grade=$1
  if [ $grade -gt 90 ];then
    echo "Is's very good!"
  elif [ $grade -gt 70 ];then
    echo "Is's is good!"
  
  elif [ $grade -ge 60 ];then
    echo "pass"
  
  else
    echo "no pass"
  fi

4.2 for循环语句

for循环语句

#格式:for name [ [ in [ word ... ] ] ; ] do list ; done
  for 变量名 in 取值列表; do
    语句 1
  done

例子 检查同一局域网多台主机是否存活

#!/bin/bash
# check hosts is on/Off
# by rivers on 20219-23

Network=$1
for Host in $(seq 1 254)
do
ping -c 1 $Network.$Host > /dev/null && result=0 || result=1

if [ "$result" == 0 ];then
  echo -e "\033[32;1m$Network.$Host is up \033[0m"
  echo "$Network.$Host" >> /tmp/up.txt

else
  echo -e "\033[;31m$Network.$Host is down \033[0m"
  echo "$Network.$Host" >> /tmp/down.txt
fi
done

4.3 while循环语句

         While循环语句与for循环功能类似,主要用于对某个数据域进行循环读取、对文件进行遍历,通常用于需要循环某个文件或者列表,满足循环条件会一直循环,不满足则退出循环,其语法格式以while…do开头,done结尾与 
        while 关联的还有一个 until 语句,它与 while 不同之处在于,是当条件表达式为 false 时才循环,实际使用中比较少,这里不再讲解。

# While循环语句与for循环功能类似,主要用于对某个数据域进行循环读取、对文件进行遍历,通常用于需要循环某个文件或者列表,满足循环条件会一直循环,不满足则退出循环,其语法格式以while…do开头,done结尾与 
#while 关联的还有一个 until 语句,它与 while 不同之处在于,是当条件表达式为 false 时才循环,实际使用中比较少,这里不再讲解。

while  (表达式)
do
  语句1
done

break和continue语句

# break 和 continue 语句
  break 是终止循环。
  continue 是跳出当前循环。
#示例 1:在死循环中,满足条件终止循环
while true; do
  let N++
  if [ $N -eq 5 ]; then
    break
fi
  echo $N
done
输出: 1 2 3 4

#示例 2:举例子说明 continue 用法
N=0
while [ $N -lt 5 ]; do
  let N++
if [ $N -eq 3 ]; then
  continue
fi
  echo $N
done

输出: 1 2 4

# 打印 1-100 数字
i=0
while ((i<=100))
do
        echo  $i
        i=`expr $i + 1`
done

例子1 求1-100的 总和

#!/bin/bash
# by author rivers on 2021-9-27
j=0
i=1
while ((i<=100))
do
     j=`expr $i + $j`
     ((i++))
done
echo $j

例子2 每十秒循环判断一次 hbs用户是否登录

[root@web-server01~/script]# vim login.sh 
#!/bin/bash
#Check File to change. 
#By author rivers 2021-9-27
USERS="hbs"
while true
do
        echo "The Time is `date +%F-%T`"
        sleep 10
        NUM=`who|grep "$USERS"|wc -l`
        if [[ $NUM -ge 1 ]];then
                echo "The $USERS is login in system."
        fi
done

4.4 case选择语句

Case选择语句,主要用于对多个选择条件进行匹配输出,与if elif语句结构类似,通常用于脚本传递输入参数,打印出输出结果及内容,其语法格式以Case…in开头,esac结尾

#Case选择语句,主要用于对多个选择条件进行匹配输出,与if elif语句结构类似,通常用于脚本传递输入参数,打印出输出结果及内容,其语法格式以Case…in开头,esac结尾。语法格式如下:
case 模式名  in
  模式 1)
    命令
    ;;
  模式 2)
    命令
    ;;
*)
不符合以上模式执行的命令
esac
# 每个模式必须以右括号结束,命令结尾以双分号结束。

4.5 select选择语句

select 是一个类似于 for 循环的语句
Select语句一般用于选择,常用于选择菜单的创建,可以配合PS3来做打印菜单的输出信息,其语法格式以select…in do开头,done结尾:

#select 是一个类似于 for 循环的语句
#Select语句一般用于选择,常用于选择菜单的创建,可以配合PS3来做打印菜单的输出信息,其语法格式以select…in do开头,done结尾:

select i in (表达式) 
do
语句
done

# 选择mysql 版本
#!/bin/bash
# by author rivers on 2021-9-27
PS3="Select a number: "
while true; do
select mysql_version in 5.1 5.6 quit;
 do
  case $mysql_version in
  5.1)
    echo "mysql 5.1"
      break
      ;;
  5.6)
    echo "mysql 5.6"
       break
       ;;
  quit)
    exit
    ;;
  *)
    echo "Input error, Please enter again!"
      break
esac
 done
done

4.6 shell函数

        Shell允许将一组命令集或语句形成一个可用块,这些块称为Shell函数,Shell函数的用于在于只需定义一次,后期随时使用即可,无需在Shell脚本中添加重复的语句块,其语法格式以function name(){开头,以}结尾。

        Shell编程函数默认不能将参数传入()内部,Shell函数参数传递在调用函数名称传递,例如name args1 args2。

# Shell允许将一组命令集或语句形成一个可用块,这些块称为Shell函数,Shell函数的用于在于只需定义一次,后期随时使用即可,无需在Shell脚本中添加重复的语句块,其语法格式以function name(){开头,以}结尾。

# Shell编程函数默认不能将参数传入()内部,Shell函数参数传递在调用函数名称传递,例如name args1 args2。

# 函数语法
func() {
command1
command1
……
}
fun  # 直接调用函数名
# Shell 函数很简单,函数名后跟双括号,再跟双大括号。通过函数名直接调用,不加小括号。
#!/bin/bash
func() {
VAR=$((1+1))
return $VAR
echo "This is a function."
}
func
echo $?
# bash test.sh 
2

总结

Shell脚本主要就是把一些命令行操作整合起来使用,所以最重要的格式就是终端中对于命令使用的格式,这个算是比较基础的Linux使用技能了,这里就不进行介绍了,除了这个内容外Shell脚本中还有一些特有的格式。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值