shell是用户跟内核通信的几种方式中的一种
文章目录
目录
1.打开终端时系统自动调用:etc/profile或~/.hashrc
前言
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=10 | b=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脚本中还有一些特有的格式。