Linux Shell脚本

基础概念:

- 机器语言:二进制的0和1的序列,称为机器指令

- 汇编语言:用一些符号来代替机器语言

- 计算机:只能运行二进制指令

- 机器代码文件:由0和1组成的二进制文件

- 编译:将编写好的程序文件通过一个工具(编译器)变成机器代码文件,然后在变成可执行文件。
#编译的特点:效率高

- 解释:将编写好的程序文件中的代码一行一行按顺序通过一个工具(解释器)解释为二进制指令。
#解释的特点:需要把源代码交给使用者

- 编程语言分类:低级语言和高级语言
#高级语言需要经过解释或编译才能转化为计算机能识别的语言

- 编程风格:面向对象和面向过程

shell脚本;

shell:是面向过程、解释型语言(需要指定解释器)

shell脚本的格式要求:

首行遵循shebang(#!)机制

执行shell脚本:

  • 通过bash命令来执行(支持标准输入和输出)
  • 通过添加执行权限来执行

shell中的变量:

  • 自定义变量:
  • 内置变量:比如PATH、HOSTNAME、PS1等

shell变量按生效范围等标准划分:

  • 普通变量:生效范围只是当前的shell
  • 环境变量:当前shell以及shell的子进程
  • 本地变量:函数中

shell中变量的数据类型:

  • 字符型
  • 整型、浮点型

静态语言和动态语言

  • 在静态语言中使用变量之前,需要定义变量的类型
    [En]

    you need to define the type of a variable before using it in a static language*

  • 动态语言不需要定义变量类型
    [En]

    dynamic languages do not need to define the type of variable*

强类型和弱类型语言:

  • 强类型语言需要强制转换不同类型的数据操作
    [En]

    strongly typed languages require forced conversion of different types of data operations*

  • 弱类型语言:可以进行隐式转换
    [En]

    weakly typed language: can do implicit conversion*

shell属于弱类型、动态语言。所以shell变量申明的时候不需要指定变量类型,且不同类型格式进行计算的时候不需要进行强制转换。

shell变量的定义规则:

  • 区分大小写
  • 内置变量和保留字不能用
  • 数字字母下划线(数字不能用作开头)(定义主机名时不能使用‘-’)
    [En]

    numeric letter underscore (numbers cannot be used as the beginning) (‘- ‘cannot be used when defining hostnames)*

shell定义变量:

变量名='值'(等号两边不能有空格) #如果值是字符串最好用引号括起来#变量临时生效,推出shell后,变量自动删除。#在Shell中所有的变量默认都是字符串型。也就是说,如果不手工指定变量的类型,那么所有的数值都是不能进行运算的

shell查看和取消变量

  • 查看所有变量: set命令
  • 取消指定的变量: unset 变量名

shell引用变量

通过$name或${name}

单引号、双引号、反引号的区别:

  • 双引号:弱引用,其中变量将替换为相应的值
    [En]

    double quotation marks: a weak reference, in which the variables will be replaced with the corresponding values*

  • 单引号:大引号,里面有什么,显示了什么
    [En]

    single quotation marks: strong quotes, what is in it, what is displayed*

  • 反引号:命令替换,将反引号内的Linux命令先执行

shell引用变量:

$变量名或${变量名}

shell中的位置变量

是bash内置的变量,通过命令行将参数传递给shell脚本的对应参数

$n       #表示指定位置的参数,比如$1表示的就是shell脚本第一个位置的参数值

$0       #表示脚本文件的名称

$*       #表示shell脚本所有的参数

$#       #表示shell脚本参数的个数

shell的退出状态码: $?

执行该进程后,它使用$?保存此进程的状态代码。状态码取值范围为0-255。

[En]

After the process is executed, it uses $? To save the status code of this process. The value range of the status code is 0mur255.

0      #表示执行成功:

1-255  #表示执行失败(因为执行失败有很多可能性,比如语法错误、命令没找到等,所以状态码不一样。)

shell自定义退出的状态码;

定义方法: exit [num]

#脚本中一旦遇到exit命令,脚本会立即终止;终止退出状态取决于exit命令后面的数字

#如果exit后面无数字,终止退出状态取决于exit命令前面命令执行结果

#如果没有exit命令,整个脚本的退出状态码取决于脚本中执行的最后一条命令的状态码

shell脚本的调试和安全

shell脚本调试

#语法错误:会导致后续命令不执行
使用bash -n 只检测脚本中的语法错误,但无法检查出命令错误(不真正执行脚本)

#命令错误:后续命令依然会执行
使用bash -x 来跟踪命令的执行过程。

#逻辑错误:输出结果不对
使用bash -x 检查

shell脚本安全防范

set -e:如果其中一个命令错误,就中断执行
#有时候会产生误杀,比如执行一条命令返回的状态码是非0

set -u: 当一个变量没有定义的时候就退出。避免变量不存在出现的问题

范例;编写第一个shell脚本

1.编写shell脚本文件
#!/bin/bash   ##首行shebang机制,指定使用的解释器
echo 'hell shell' #编写需要做的事
#注:shell脚本中使用#号进行语句的注释

2.给脚本文件添加执行权限或者使用bash命令执行脚本
#添加执行权限的方法:
chmod +x shell_name
path/shell_name #路径/文件名

#bash命令的方法
bash shell_name

shell脚本实现算数运算和逻辑运算

shell脚本的算数运算

shell脚本实现算数运算的方法;

  • let工具
  • bc工具(支持小数运算)
  • expr工具
  • 运算语法:

shell的运算语法:

  • $[算数表达式]
  • $((算数表达式))

shell算术运算工具的使用:

let工具:

let用于执行一个或多个表达式,变量计算中 不需要加 $来表示变量
注意:这种方法 需要借助一个变量,将计算后的值赋值给这个变量后进行输出

let a=1+1

bc工具

支持标准输入和输出

echo 1+1 | bc

expr工具

expr 1 + 1
#数值与运算符号之间需要用空格隔开
#使用expr命令进行乘法运算时,需要将”乘号”转义

运算语法


#$[算数表达式]:
echo $[10+1]

#$((算数表达式))
echo $((1+1))
将变量申明为整数进行计算
#直接将变量声明为”整数”,然后即可直接进行整数运算
declare -i a
a=1+1
echo $a

shell脚本的逻辑运算

  • 与:&
  • 或:|
  • 非:!
  • 异或:^(脱字符)

短路运算

  • 短路与 &&:前面为真才会执行后面的
  • 短路或 ||:前面为真后面的就不执行了

逻辑运算的结果

逻辑运算的结果是一个布尔值。true或false

  • true:1(二进制),真
  • false:0(二进制),假
#注意:$?(退出状态码) 为0 ,表示为真,非0则表示为假

shell的条件测试语句

test命令:

用于检查条件是否为真,可以从数字、字符和档案三个方面进行测试。

[En]

Used to check whether a condition is true, it can be tested in three aspects: numeric, character and file.

test命令的格式

  • 格式一:test 表达式
  • 格式二: [ 表达式 ] (中括号的两边要有空格作为间隔)
  • 格式三: [[ 表达式 ]] (且支持扩展正则表达式和通配符)
#注意:test和中括号等价
[root@centos8 ~]#help [
[: [ arg... ]
   Evaluate conditional expression.   
   This is a synonym for the "test" builtin, but the last argument must
   be a literal ]', to match the opening ['.

使用test判断文件的权限

  • -r:是否存在读权限
  • -x:是否存在执行权限
  • -w:是否存在写权限
    示例:确定文件是否具有读取权限
    [En]

    Example: determine whether a file has read permission

test -r aa; echo $? 或 [ -r aa ];echo $?#若存在,退出状态码为0

文件类型判断

  • -f:是否为文本文件
  • -d:是否为目录文件

文件状态判断

  • -e:文件是否存在
  • -a:文件是否存在

字符串判断:

  • -z STRING: 字符串是否为空,没定义或空为真,不空为假
  • = != >

数字之间比较

  • -eq: equal,相等
  • -ne: not-equal,不等
  • -gt: greater-than,大于
  • -lt:less-than,小于

[[ expression ]] 用法

使用通配符的时候: == 和 !=

会把右侧的认为是通配符

使用正则表达式的时候: =~

将把右边的视为正则表达式(扩展正则表达式)

[En]

Will treat the one on the right as a regular expression (extended regular expression)

组合条件测试

通过这两个条件AND,或将它们连接起来

[En]

Pass the two conditions and, or connect them

  • 并且: -a
  • 或者: -o

范例:

#如果当前用户非root且该文件不存在就创建这个文件
[ $(whoami) != 'root' -a ! -e /data/dir ] && sudo mkdir /data/dir

read命令

接受键盘输入并将其赋给指定的变量。

[En]

Accept keyboard input and assign it to a specified variable.

#若没有指定变量来接受read得到的数据,则默认赋值给内置的变量REPLY
#判断用户输入的是否为YES
#!/bin/bash
read -p 'continute?yes or no:'  ANSWER
[[ $ANSWER  =~  ^([yY][eE][sS])$ ]]  && echo "let's continue" || echo "stop"
#检查主机的网络状态

#!/bin/bash
read -p "please input IP:" IP
[[ "$IP" =~  ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$  ]] && echo "$IP is availabe"
ping -c 4 $IP > /dev/null && echo "$IP is Up " || echo "$IP is unreachable"
选项;

-p:指定提示的信息

()和{}

功能:将多个命令组合在一起,并批量执行

[En]

Function: combine multiple commands together and execute them in batches

格式:( cmd;cmd2….)或{ cmd,cmd2…} –括号左边要有空格

#()和{}批量执行命令的区别:使用小括号(),里面执行的命令会开启子进程,大括号不会

范例:

#打印X的值
echo hello | read X; echo $X
#输出的结果为空,因为使用管道的时候会在管道的两边开启子进程。而echo $x是在父进程执行的,子进程的X和父进程的X不是同一个东西

#解决方法: 确保read和echo在一个进程里面进行
echo hell | {  read X; echo $X;}或echo hell | ( read X; echo $X;) #括号左边空格,最末尾的命令要加上分号。

Linux Shell脚本
Linux Shell脚本

范例:

#判断网络的状态
IP="x.x.x.x" #赋值的时候等号两边不能有空格   -c:指定ping的次数
ping -c 4 $IP &> /dev/null  && echo "$IP is up"  || echo "$IP is unreachable";
echo "scripts is finished"
exit
#范例:磁盘空间的判断,判断某块磁盘的使用空间是否达到临界值

WARING=80 #设置一个临界值
SPACE_USE=df|grep '^/dev/sd'|tr -s ' ' %|cut -d% -f5|sort -nr|head -1
[ "$SPACE_USED" -ge $WARNING ] && echo "disk used is $SPACE_USED,will be full"

#tr命令
#作用: 字符转换和删除
#选项:
-d:delete
-s:squeeze-repeats
#范例:
转换:tr '123' 'abc' #把132转换成abc -- 一 一对应 1--a 2--b
删除: tr -d '需要删除的内容'
将多个连续的字符压缩或转换成一个指定字符:tr -s '' #把多个连续的空格压缩成一个空格(-s:把相同连续的字符合成一个)

cut命令:
作用:提取列
选项:
#-d -- 指定分隔符
#-f -- 指定提取取那些列

head命令:
作用:显示文件的前几行
选项:
-n:指定获取前x行

shell脚本的流程控制语句

  • 条件选择
  • 条件判断
  • 循环语句

shell的条件选择语句:if

  • 单分支
  • 双分支
  • 多分支

单分支格式

if 判断条件;then
   执行的操作
fi

双分支格式

if 判断条件;then
   执行的操作
else
   执行的操作
fi

多分支

if 判断条件;then
   执行的操作
elif
   执行的操作
   ......

else
   执行的操作
fi

范例

#根据命令的退出状态来执行命令
#/bin/bash
read IP
if ping -c 2 $IP &> /dev/null;then
    echo "$IP is up"
else
    echo "$IP is unreachable"
fi

条件判断 case 语句

case 变量引用 in
PAT1)
    执行相关操作
    ;;
PAT2)
    执行相关操作
    ;;
*)
    执行相关操作
    ;;
esac

#case语句支持通配符
* 任意长度任意字符
? 任意单个字符
[] 指定范围内的任意单个字符
| 或者,如: a|b

范例:

#判断输入的是yes还是no

#!/bin/bash
read -p 'do you agree(yes|no): ' input

case $input in
y|yes)
    echo 'You input is yes'
    ;;
n|no)
    echo 'you input is no'
    ;;
*)
    echo 'you input is other'
    ;;
esac
#运维菜单实现版本2

#!/bin/bash
cat <<eof 请选择: 1)备份数据库 2)清理日志 3)软件升级 4)软件回滚 5)删库跑路 eof read -p '请输入上面的数字进行选择: ' num case $num in 1) echo '备份数据库' ;; 2) '清理日志' 3) '软件升级' 4) '软件回滚' 5) '删库跑路' *) '以上所有' esac < code></eof>

shell的循环语句:

  • for
  • while
  • until(不常用)

for循环格式

格式一:
for &#x53D8;&#x91CF; in &#x5217;&#x8868;
do
    &#x8981;&#x505A;&#x7684;&#x64CD;&#x4F5C;
done
for列表的生成方式
  • 直接给出列表:1 2 3 4 5 …

  • 整数列表:{start..end} 、$(seq [start [step]] end)

  • 通过$()命令替换得到列表
格式二:
for((&#x8868;&#x8FBE;&#x5F0F;&#x4E00;&#xFF1B;&#x8868;&#x8FBE;&#x5F0F;&#x4E8C;&#xFF1B;&#x8868;&#x8FBE;&#x5F0F;&#x4E09;))&#xFF1B;do
    &#x8981;&#x505A;&#x7684;&#x64CD;&#x4F5C;
done

范例
#&#x4F7F;&#x7528;for&#x5FAA;&#x73AF;&#x8BED;&#x53E5;&#x5B9E;&#x73B0;1+100
#!/bin/bash
sum=0
for num in seq 100;do   #&#x5217;&#x8868;1-100&#x7684;&#x8868;&#x793A;&#x65B9;&#x6CD5;&#xFF1B; {1..100} seq 100
    let sum=$sum+$num  #let
done
echo $sum

#&#x4F7F;&#x7528;seq&#x547D;&#x4EE4;&#x7ED3;&#x5408;bc&#x5DE5;&#x5177;&#x5B9E;&#x73B0;&#xFF1A;
seq -s+ 100 | bc
-s:&#x6307;&#x5B9A;&#x5206;&#x9694;&#x7B26;&#xFF0C;&#x9ED8;&#x8BA4;&#x5206;&#x9694;&#x7B26;&#x662F;\n(&#x6362;&#x884C;)

#&#x4F7F;&#x7528;tr&#x547D;&#x4EE4;&#x7ED3;&#x5408;bc&#x5DE5;&#x5177;&#x5B9E;&#x73B0;&#xFF1A;
echo {1..100}|tr ' ' +|bc
#&#x6C42;100&#x4EE5;&#x5185;&#x7684;&#x5947;&#x6570;&#x548C;
&#x5217;&#x8868;:{1..100..2} #&#x4E00;&#x5230;100&#x8FD9;&#x4E2A;&#x8303;&#x56F4;&#xFF0C;&#x4EE5;2&#x4F5C;&#x4E3A;&#x8DF3;&#x6570;
#99&#x4E58;&#x6CD5;&#x8868;&#x7684;&#x5B9E;&#x73B0;
#!/bin/bash

for i in {1..9};do
    for j in {1..9};do
     if [ $i -ge $j ];then
       echo -e "$i * $j = $[i*j]\t\c"  #\c&#x5F88;&#x5173;&#x952E;
         fi
    done
    echo
done

#\t:&#x4E00;&#x4E2A;&#x5236;&#x8868;&#x4F4D;,&#x5B9E;&#x73B0;&#x5BF9;&#x9F50;&#x7684;&#x529F;&#x80FD; \n:&#x6362;&#x884C;&#x7B26; \c:&#x6709;&#x4E86;-e&#x53C2;&#x6570;&#xFF0C;&#x6211;&#x4EEC;&#x4E5F;&#x53EF;&#x4EE5;&#x4F7F;&#x7528;&#x8F6C;&#x4E49;&#x5B57;&#x7B26;\c&#x6765;&#x5F3A;&#x5236; echo &#x547D;&#x4EE4;&#x4E0D;&#x6362;&#x884C;
#&#x5C06;&#x6307;&#x5B9A;&#x76EE;&#x5F55;&#x4E0B;&#x6587;&#x4EF6;&#x7684;&#x6240;&#x6709;&#x540E;&#x7F00;&#x6539;&#x540D;&#x4E3A; bak &#x540E;&#x7F00;
#&#x5C06;/data/&#x4E0B;&#x9762;&#x7684;&#x6240;&#x6709;&#x6587;&#x4EF6;&#x8BE5;&#x6709;bak&#x540E;&#x7F00;
#!/bin/bash
DIR="/data/"
cd $DIR  || { echo "cannot inner this dir";exit; }
for FILE in * ;do #&#x627E;&#x5230;/data&#x76EE;&#x5F55;&#x91CC;&#x9762;&#x7684;&#x6587;&#x4EF6;&#x5217;&#x8868;   *&#x662F;&#x901A;&#x914D;&#x7B26;&#xFF1A;&#x8868;&#x793A;&#x6240;&#x6709;
    PRE=echo ${FILE} | grep -Eo ".*\."  #&#x53BB;&#x6389;&#x6587;&#x4EF6;&#x7684;&#x540E;&#x7F00;&#xFF0C;&#x5982;&#x679C;&#x6CA1;&#x6709;&#x540E;&#x7F00;&#x5219;&#x4E0D;&#x4F1A;&#x5339;&#x914D;&#x5230;
    sudo  mv ${FILE}  ${PRE}bakup #&#x7ED9;&#x53BB;&#x6389;&#x540E;&#x7F00;&#x7684;&#x6587;&#x4EF6;&#x540D;&#x52A0;&#x4E0A;&#x540E;&#x7F00;
done
#&#x5C06;&#x76EE;&#x5F55;YYYY-MM-DD/&#x4E2D;&#x6240;&#x6709;&#x6587;&#x4EF6;&#xFF0C;&#x79FB;&#x52A8;&#x5230;YYYY-MM/DD/&#x4E0B;  &#x6BCF;&#x5929;&#x90FD;&#x4F1A;&#x751F;&#x6210;&#x4E00;&#x4E2A;&#x4EE5;&#x5F53;&#x5929;&#x65E5;&#x671F;&#x4E3A;&#x540D;&#x5B57;&#x76EE;&#x5F55;&#xFF0C;&#x91CC;&#x9762;&#x5B58;&#x653E;&#x4E00;&#x4E9B;&#x6587;&#x4EF6;&#x3002;

1. &#x521B;&#x5EFA;&#x6A21;&#x62DF;&#x7684;&#x5B9E;&#x9A8C;&#x73AF;&#x5883;
#!/bin/bash
PDIR=/data/test
for i in {1..365};do
 DIR=date -d "-$i day" +%F #-d:&#x6307;&#x5B9A;&#x65E5;&#x671F; -num&#xFF1A;&#x8868;&#x793A;&#x5F53;&#x524D;&#x7684;&#x524D;&#x4E00;&#x5929;
                    #date -d "-1 year" +%F &#x8868;&#x793A;&#x4EE5;%F&#x8FD9;&#x79CD;&#x683C;&#x5F0F;&#x6765;&#x663E;&#x793A;&#x5F53;&#x524D;&#x65E5;&#x671F;&#x7684;&#x524D;&#x4E00;&#x5929;
 mkdir -pv $PDIR/$DIR #&#x521B;&#x5EFA;&#x6307;&#x5B9A;&#x7684;&#x6587;&#x4EF6;
 cd $PDIR/$DIR
 for j in {1..10};do
 touch $RANDOM.log  #&#x968F;&#x673A;&#x521B;&#x5EFA;&#x5341;&#x4E2A;&#x6587;&#x4EF6;
 done
done

#&#x5C06;&#x4E0A;&#x9762;&#x7684;&#x76EE;&#x5F55;&#x79FB;&#x52A8;&#x5230;YYYY-MM/DD/&#x4E0B;
#!/bin/bash
DIR=/data/test #&#x603B;&#x76EE;&#x5F55;
cd $DIR || {  echo "&#x65E0;&#x6CD5;&#x8FDB;&#x5165; $DIR";exit; }
for subdir in * ; do  #*&#x8868;&#x793A;&#x603B;&#x76EE;&#x5F55;&#x4E0B;&#x9762;&#x7684;&#x6BCF;&#x4E00;&#x4E2A;&#x5B50;&#x76EE;&#x5F55;&#x7684;&#x540D;&#x79F0;
    YYYY_MM=echo $subdir | cut -d"-" -f1,2 #&#x53D6;&#x5E74;&#x6708;
    DD=echo $subdir | cut -d"-" -f3  #&#x53D6;&#x65E5;
    [ -d $YYYY_MM/$DD ] || mkdir -p $YYYY_MM/$DD &> /dev/null #&#x5224;&#x65AD;&#x6587;&#x4EF6;&#x662F;&#x5426;&#x5B58;&#x5728;&#xFF0C;&#x4E0D;&#x5B58;&#x5728;&#x5C31;&#x521B;&#x5EFA;&#x4E00;&#x4E2A;
    mv $subdir/* $YYYY_MM/$DD #&#x79FB;&#x52A8;&#x6587;&#x4EF6;&#x5230;&#x65B0;&#x7684;&#x6587;&#x4EF6;&#x5939;&#x4E0B;&#x9762;&#x53BB;
done
rm -rf $/DIR/*-*-* #&#x5220;&#x9664;&#x6389;&#x65E7;&#x7684;&#x6587;&#x4EF6;

#date&#x547D;&#x4EE4;&#x7684;&#x4F7F;&#x7528;
&#x4F5C;&#x7528;&#xFF1A;&#x663E;&#x793A;&#x548C;&#x8BBE;&#x7F6E;&#x7CFB;&#x7EDF;&#x65F6;&#x95F4;
&#x9009;&#x9879;&#xFF1A;
-d <字符串> &#x663E;&#x793A;&#x5B57;&#x7B26;&#x4E32;&#x6240;&#x6307;&#x7684;&#x65E5;&#x671F;&#x4E0E;&#x65F6;&#x95F4;&#xFF0C;&#x6BD4;&#x5982;&#xFF1A;"-1 day" &#x8868;&#x793A;&#x5F53;&#x524D;&#x65E5;&#x671F;&#x7684;&#x524D;&#x4E00;&#x5929;,&#x5FC5;&#x987B;&#x8981;&#x52A0;&#x53CC;&#x5F15;&#x53F7;
-s <字符串> &#x8BBE;&#x7F6E;&#x5F53;&#x524D;&#x7684;&#x65F6;&#x95F4;&#x548C;&#x65E5;&#x671F;
#&#x65F6;&#x95F4;&#x65E5;&#x671F;&#x683C;&#x5F0F;&#xFF1A;
%T&#xFF1A;time&#xFF0C;&#x663E;&#x793A;&#x65F6;&#x5206;&#x79D2;&#xFF0C;24&#x5C0F;&#x65F6;&#x5236;&#xFF08;hh:mm:ss&#xFF09;
%F&#xFF1A;full date&#xFF0C;&#x663E;&#x793A;&#x5E74;&#x6708;&#x65E5;&#xFF0C;%Y-%m-%d

#&#x8303;&#x4F8B;&#xFF1A;
&#x4F7F;&#x7528;date&#x8BBE;&#x7F6E;&#x5E74;&#x6708;&#x65E5;&#xFF1A;
date -s "20220710"&#x6216;date -s "YYYY-MM-DD" #&#x65F6;&#x95F4;&#x8BBE;&#x7F6E;&#x6210;2022&#x5E74;7&#x6708;10&#x65E5;0&#x65F6;0&#x5206;
&#x53EA;&#x8BBE;&#x7F6E;&#x65F6;&#x95F4;&#xFF0C;&#x4E0D;&#x6539;&#x5E74;&#x6708;&#x65E5;
date -s "hh:mm:ss"
&#x8BBE;&#x7F6E;&#x5168;&#x90E8;&#x65F6;&#x95F4;
date -s "YYYY-YY-DD HH:mm:ss"

hwclock&#x547D;&#x4EE4;&#x5B9E;&#x73B0;&#x65F6;&#x95F4;&#x6821;&#x5BF9;
-s, --hctosys #&#x4EE5;&#x786C;&#x4EF6;&#x65F6;&#x949F;&#x4E3A;&#x51C6;&#xFF0C;&#x6821;&#x6B63;&#x7CFB;&#x7EDF;&#x65F6;&#x949F;
-w, --systohc #&#x4EE5;&#x7CFB;&#x7EDF;&#x65F6;&#x949F;&#x4E3A;&#x51C6;&#xFF0C;&#x6821;&#x6B63;&#x786C;&#x4EF6;&#x65F6;&#x949F;
</字符串></字符串>

shell脚本的while循

while循环格式

while &#x5224;&#x65AD;&#x6761;&#x4EF6;&#xFF1B;do
      &#x6240;&#x4F5C;&#x7684;&#x64CD;&#x4F5C;
done

#&#x5FAA;&#x73AF;&#x63A7;&#x5236;&#x6761;&#x4EF6;&#xFF1B;&#x8FDB;&#x5165;&#x5FAA;&#x73AF;&#x4E4B;&#x524D;&#xFF0C;&#x5148;&#x505A;&#x4E00;&#x6B21;&#x5224;&#x65AD;&#xFF1B;&#x6BCF;&#x4E00;&#x6B21;&#x5FAA;&#x73AF;&#x4E4B;&#x540E;&#x4F1A;&#x518D;&#x6B21;&#x505A;&#x5224;&#x65AD;&#xFF1B;
#&#x6761;&#x4EF6;&#x4E3A;&#x201C;true&#x201D;&#xFF0C;&#x5219;&#x6267;&#x884C;&#x4E00;&#x6B21;&#x5FAA;&#x73AF;&#xFF1B;&#x76F4;&#x5230;&#x6761;&#x4EF6;&#x6D4B;&#x8BD5;&#x72B6;&#x6001;&#x4E3A;&#x201C;false&#x201D;&#x7EC8;&#x6B62;&#x5FAA;&#x73AF;
#while&#x5FAA;&#x73AF;&#x5B9E;&#x73B0;1+...100
#!/bin/bash
sum=0
i=1
while [ $i -le 100 ] ;do
  let sum=$sum+$i
  let i+=1
done
echo $sum
#&#x5206;&#x533A;&#x5229;&#x7528;&#x7387;&#x7684;&#x76D1;&#x63A7;
#!/bin/bash
WARING=80
while true ; do  #&#xFF1A;&#x547D;&#x4EE4;&#x8FD0;&#x884C;&#x7ED3;&#x679C;&#x8D4B;&#x503C;&#x7ED9;&#x53D8;&#x91CF;&#xFF0C;&#x4E0D;&#x52A0;&#x5219;&#x628A;&#x4ED6;&#x4F5C;&#x4E3A;&#x5B57;&#x7B26;&#x4E32;&#x3002;$&#xFF08;&#xFF09;&#x53EF;&#x4EE5;&#x76F4;&#x63A5;&#x5D4C;&#x5957;
    USE=df | sed -nr '/^\/dev\/sd/s#.* ([0-9]+)%.*#\1#p' #&#x4F7F;&#x7528;sed&#x83B7;&#x53D6;&#x5206;&#x533A;&#x5229;&#x7528;&#x7387;
    if [ $WARING -lt $USE ];then
        echo "disk is will be full from hostname -I"
    else
        echo "disk is so big from hostname -I" #&#x4E3B;&#x673A;ip&#x5730;&#x5740;
    fi
    sleep 2
done

Original: https://www.cnblogs.com/heyongshen/p/16464365.html
Author: 背对背依靠
Title: Linux Shell脚本

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/523139/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球