Linux中的shell编程

十八、shell编程

1.shell中的命令

1)sleep命令

在有的shell中sleep支持睡眠(分,小时)

sleep 1    睡眠1秒
sleep 1s   睡眠1秒
sleep 1m   睡眠1分
sleep 1h   睡眠1小时 

2)“|”“||”“&”“&&”的区别

|”:是管道符,前面的内容传到管道后的命令中执行
“||”:command1 || command2,当commad1返回为true时command2不执行,当command1返回为false时,command2才执行
“&”:command  &  表示执行command命令,并使其在后台运行
“&&”:与“||”相反,command1  &&  command2,当commad1返回为true时command2执行,当command1返回为false时,command2不执行

3)exit

退出当前脚本执行,不再走下面的程序,并且返回一个退出的状态,状态的取值状态为0-255,一般0表示正常退出

4)let

let 命令是 BASH 中用于计算的工具,用于执行一个或多个表达式,变量计算中不需要加上 $ 来表示变量。如果表达式中包含了空格或其他特殊字符,则必须引起来。

  • 语法格式
let arg [arg ...]
自加操作:let no++
自减操作:let no--
简写形式:let no+=10 ,let no-=20,分别等同于let no=no+10,let no=no-20

5)read 读取控制台的输入

read [选项] [参数]
选项:
-p:指定读取值时的提示内容
-t:指定读取值时,等待的时间(秒)

在这里插入图片描述

2.shell脚本的执行方式

1)脚本格式要求

脚本以#!/bin/bash开头
脚本需要有可执行权限

2)脚本常用的执行方式

  • 方式一:输入脚本的绝对路径或相对路径
    在这里插入图片描述

  • 方式二:sh + 脚本
    在这里插入图片描述

3. shell的变量

1)shell变量的介绍

变量分为两种:系统变量和用户自定义变量
显示当前shell所有变量:set

2)shell变量的定义

  • 基本语法 变量=值 注意,变量名和等号之间不能有空格 A=100
  • 撤销变量:unset 变量
  • 声明静态变量:readonly 变量,注意:不能 unset 变量
  • 可把变量提升为全局变量,可供其他shell程序使用 export 变量名=变量值
  • 将命令的返回值赋值给变量 A=ls -la 反引号,运行里面的命令,并把结果返回给变量A A=$(ls -la) $小括号,等价于反引号

3)使用变量

使用一个定义过的变量,只要在变量名前面加美元符号即可,如:

your_name="qinjx"
echo $your_name
echo ${your_name}
变量名外面的花括号是可选的,加不加都行,加花括号是为了帮助解释器识别变量的边界,建议每次都加上养成好的习惯

在这里插入图片描述

4.位置参数变量

1)基本语法:

$n:(功能描述:n为数字,$0代表命令本身,$1-$9代表第1到第9个参数,10以上的参数需要用大括号包含,如${10}$*:这个变量代表命令行中所有的参数,$*把所有的参数看成一个整体
$@:这个变量也代表命令行中的所有参数,$@把每个参数区分对待
$#:代表命令行中所有参数的个数

2)案例

在这里插入图片描述
在这里插入图片描述

5.预定义变量

  • 基本介绍:
    shell设计者编写系统时设计好的变量,可以直接在shell中使用

  • 基本语法
    $$ :当前进程的进程号(PID)
    $! :后台运行的最后一个进程的进程号
    $? :最后一次执行命令的返回状态。如果变量的值为0,证明上一个命令正常执行,如果变量为非0(具体哪个数由命令自己决定),证明上一个命令没有正常执行

  • 案例
    在这里插入图片描述

在这里插入图片描述

6.运算符

1)“==”,”-eq”判断字符和数字是否相等的疑问

首先要明白一个概念:bash中所有的变量都是字符串。 对变量进行数值计算时,只不过是把字符串转换成数字,然后计算,计算后再把结果数字转换为字符串。
"=="是判断字符串是否相等。
"-eq"是判断字符串对应转换后的数字值是否相等。

  • 案例分析
#!/bin/bash
num1=123	#num1是长度为3的字符串
num2=0123	#num2是长度为4的字符串

echo "======================================"

echo -n "用==比较时:"
if [ $num1 == $num2 ]
then
	echo "$num1$num2相等"
else
	echo "$num1$num2不相等"
fi

echo "======================================"

echo -n "用-eq比较时:"
if [ $num1 -eq $num2 ]
then
	echo "$num1$num2相等"
else
	echo "$num1$num2不相等"
fi

- 输出结果为:
========================================比较时:123和0123不相等
======================================
用-eq比较时:123和0123相等
  • 结论:

==直接比较字符串,-eq比较字符串对应的数字值。

!=、>、 <、 >=、 <= 与-ne、 -gt、 -lt、 -ge、 -le 的区别也一样

2)算术运算符

  • $((运算式))
  • $[运算式] 推荐使用
  • expr m + n
    在这里插入图片描述

注意:
表达式和运算符之间要有空格,例如 2+2 是不对的,必须写成 2 + 2,这与我们熟悉的大多数编程语言不一样。
完整的表达式要被 包含,注意这个字符不是常用的单引号,在 Esc 键下边。

运算符 说明 举例

  • 加法 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。

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。
  • 逻辑运算符
    以下介绍 Shell 的逻辑运算符,假定变量 a 为 10,变量 b 为 20:
运算符	说明				举例
&&		逻辑的 AND		[[ $a -lt 100 && $b -gt 100 ]] 返回 false
||		逻辑的 OR		[[ $a -lt 100 || $b -gt 100 ]] 返回 true

5)字符串运算符

下表列出了常用的字符串运算符,假定变量 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。

6)文件测试运算符

文件测试运算符用于检测 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。

7.流程控制

1)if

if  [condition]
then
    command1 
    command2
    ...
    commandN 
fi

或者
if  [condition];then
    command1 
    command2
    ...
    commandN 
fi

2)if else

if condition
then
    command1 
    command2
    ...
    commandN
else
    command
fi

3)if elseif else

if condition1
then
    command1
elif condition2 
then 
    command2
else
    commandN
fi

4)for循环

for  变量 in  item1 item2 ... itemN
do
    command1
    command2
    ...
    commandN
donefor((初始值;循环控制条件:变量变化));do
    command_1;
    command_2;
    commond_..;
done;

通常情况下 shell 变量调用需要加 , 但 是 f o r 的 ( ( ) ) 中 不 需 要 加 ,但是 for 的 (()) 中不需要加 ,for(()),下面来看一个例子:

#!/bin/bash
for((i=1;i<=5;i++));do
    echo "这是第 $i 次调用";
done;

5)while循环

while condition
do
    command
done

举例:

#!/bin/bash
int=1
while(( $int<=5 ))
do
    echo $int
    let "int++"
done

6)until循环

until 循环执行一系列命令直至条件为 true 时停止。
until 循环与 while 循环在处理方式上刚好相反。
一般 while 循环优于 until 循环,但在某些时候—也只是极少数情况下,until 循环更加有用。

  • until 语法格式:
until condition
do
    command
done
  • 举例:
#!/bin/bash

a=0

until [ ! $a -lt 10 ]
do
   echo $a
   a=`expr $a + 1`
done

7)case

casein
模式1)
    command1
    command2
    ...
    commandN
    ;;
模式2)
    command1
    command2
    ...
    commandN
    ;;
esac
  • 举例:
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

8)函数

  • 函数格式
[ function ] funname [()]

{

    action;

    [return int;]

}
  • 说明:

1、可以带function fun() 定义,也可以直接fun() 定义,不带任何参数。
2、参数返回,可以显示加:return 返回,如果不加,将以最后一条命令运行结果,作为返回值。 return后跟数值n(0-255
下面的例子定义了一个函数并进行调用:

#!/bin/bash

demoFun(){
    echo "这是我的第一个 shell 函数!"
}
echo "-----函数开始执行-----"
demoFun
echo "-----函数执行完毕-----"
输出结果:

-----函数开始执行-----
这是我的第一个 shell 函数!
-----函数执行完毕-----
下面定义一个带有return语句的函数:
#!/bin/bash

funWithReturn(){
    echo "这个函数会对输入的两个数字进行相加运算..."
    echo "输入第一个数字: "
    read aNum
    echo "输入第二个数字: "
    read anotherNum
    echo "两个数字分别为 $aNum$anotherNum !"
    return $(($aNum+$anotherNum))
}
funWithReturn
echo "输入的两个数字之和为 $? !"
输出类似下面:

这个函数会对输入的两个数字进行相加运算...
输入第一个数字: 
1
输入第二个数字: 
2
两个数字分别为 1 和 2 !
输入的两个数字之和为 3 !
函数返回值在调用该函数后通过 $? 来获得。

注意:所有函数在使用前必须定义。这意味着必须将函数放在脚本开始部分,直至shell解释器首次发现它时,才可以使用。调用函数仅使用其函数名即可。
  • 函数参数

在Shell中,调用函数时可以向其传递参数。在函数体内部,通过 $n 的形式来获取参数的值,例如,$1表示第一个参数,$2表示第二个参数…

带参数的函数示例:

#!/bin/bash
# author:菜鸟教程
# url:www.runoob.com

funWithParam(){
    echo "第一个参数为 $1 !"
    echo "第二个参数为 $2 !"
    echo "第十个参数为 $10 !"
    echo "第十个参数为 ${10} !"
    echo "第十一个参数为 ${11} !"
    echo "参数总数有 $# 个!"
    echo "作为一个字符串输出所有参数 $* !"
}
funWithParam 1 2 3 4 5 6 7 8 9 34 73
输出结果:

第一个参数为 1 !
第二个参数为 2 !
第十个参数为 10 !
第十个参数为 34 !
第十一个参数为 73 !
参数总数有 11 个!
作为一个字符串输出所有参数 1 2 3 4 5 6 7 8 9 34 73 !
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值