Linux笔记02 —— Shell补充

本文涉及的产品
实时计算 Flink 版,5000CU*H 3个月
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
智能开放搜索 OpenSearch行业算法版,1GB 20LCU 1个月
简介: Linux笔记02 —— Shell补充

Linux04 Shell编程一

认识Shell脚本

概念

  • Shell脚本是包含一系列命令的文本文件。
  • Shell读取此文件并执行命令。
  • 翻译命令环境的位置:/bin/bash (Bash解释器的位置) | /bin/sh (Shell解释器的位置)。

应用场景

  • 重复性操作。
  • 批量事务处理。
  • 自动化运维。
  • 定时任务执行。

示例

  • 在多台服务器上定期备份文件(1+4)。
  • 编写脚本扫描某个目录中的文件并进行特定操作(2)。
  • 编写脚本来自动监测服务器性能、清理临时文件、更新软件包、管理用户账户等(3)。

如何实现个性化安装?

  • 先构建一个安装的脚本 install.sh
  • install.sh 指定的虚拟机名称(如果没有指定虚拟机则对全部虚拟机执行)。

vim

安装

yum -y install vim-enhanced.x86_64

将缩进设置为4位

vim /etc/vimrc
:set tabstop=4
:set softtabstop=4
:set shiftwidth=4

编写脚本

#!/bin/bash # #!用于告诉系统脚本需要什么解释器来执行
echo "Hello world"

运行Shell脚本

同步与异步的区别

  • 异步指程序的执行不按照严格的顺序,通常用于多任务处理。此处适用于在后台运行的长时间任务。
  • 同步指程序的执行需按照严格的顺序,此处适用于影响当前环境的配置任务。

异步执行

/bin/sh test.sh
/bin/bash test.sh
./test.sh # 在test.sh先在第一行写!/bin/bash + chmod u+x test.sh
  • 当频繁执行一个脚本时,授予其执行权限并用./执行。

同步执行

source test.sh # 在当前bash环境下执行,不需要授权

变量

定义变量

  • varA=Hello | "Hello"
  • 判断值是否需要使用 "" 括起来:
    1. 简单值或数字时不需要:varA=Hello varB=42
    2. 值包含空格或特殊字符,变量替换时需要:varA="Hello World" varA="$varB"
  • 不需要声明变量,等号前后不能有空格,变量用完之后需要撤销变量。
  • 变量的命名按照驼峰原则。

撤销变量

unset varA

将命令结果分配给变量

varA=`ls -l`

变量拼接

echo "info : $a"

${}

  • $ 表示提取。
  • {} 用来锁定变量名边界,若边界无需锁定可缺省。
  • ${MYTEST} 直接使用环境变量。

作用域

  • 全局变量:当前的整个Shell会话中有效。
  • 局部变量:只能在函数内部使用。
  • 环境变量:可以在其它Shell中使用。如系统级:$PATH,用户级:$JAVA_HOME

类别

  • 系统变量
  • 自定义变量

输出Java的环境变量

echo $PATH | awk '{split($0,a,":"); for(i in a){if(match(a[i],"jdk")) print(a[i])}}'

位置变量$n

  • $0 用于获取当前脚本文件名称。
  • $1~$9 获取第1输入参数到第9输入参数。
  • ${10} 获取第10输入参数。

预定义变量

  • $# 命令行参数或位置参数的数量。如 ./test.sh arg1 arg2 arg3 => test.sh内 echo $# => 3
  • $? 最近一次执行的命令或shell脚本的返回值(0表示没有错误,其他任何值表明有错误 不写默认为0)。
  • $*|$@ 表示所有的位置参数。
  • `$$` 变量是shell脚本里面的进程ID。 ```bash # var_test.sh # 参数数量 argCount=$# # 所有变量 allArgs=$* # 当前脚本执行时进程号 proNo=$$

序(编)号参数

if [ "$1" ];then
echo -e "INFO : ${argCount}\t$proNo"
echo "ARGS : $allArgs"
exit 0
else
exit 1
fi


### read读取控制台输入
```bash
read [选项][参数]
-p 后面跟提示信息,即在输入前打印提示信息
-t 后面跟秒数,定义输入字符的等待时间
read -t 30 -p "Please enter your name in 30 seconds:" NAME
echo $NAME

表示用户在30秒内需要输入名字,名字会存储在NAME变量中,并会将他们的名字打印。

Shell算术表达式和算术运算符

表达式

  • let c=a+b
  • c=$[a+b]
  • c=$((a+b))

特殊:c=$[(1+3)/(2+3)]let c = (1+3)/(2+3)

  • 都不存在以上的let错误。

如果a='5', b=2, let c=a+b之后c的结果为7。
如果c="$a+$b",实现了字符串拼接。

运算符

  • + - * / % = == !=
  • += -=( let ++a|((++a))|((a=a+1)) )

Shell条件表达式

  • [ 条件表达式 ][ $a == 5 ] 三个以上逻辑表达式会报警告。
  • 条件成立时,返回true,否则返回false。
  • =~ 通常用于正则匹配,[]不可用,[[]]可用。
  • 示例:判断压缩包的后缀名 if [[ !"$pack" =~ ^.*jdk.*(tar\.gz|tgz)$ ]]; then

Shell关系运算符

关系运算符只支持数字,返回true或false。

  • -eq equal to
  • -ne not equal to
  • -gt greater than
  • -lt less than
  • -le less than or equal to
  • -gt greater than
  • -ge greater than or equal to

示例:[ -1 -eq 1 ] => false

Shell逻辑运算符

  • && || 用于 [] 外或 [[ ]]
  • -a -o 用于 []
  • 示例:[1 -eq 2 -a 2 -gt 1] [[1 -eq 2 && 2 -lt 3]] 或者 [1 -eq 2] && [2 -lt 3]

Shell字符串运算符

  • == !=
  • -n: 不为空时为真
  • -z: 为空时为真

Shell文件操作符

  • -d 判断是否为目录
  • -e 判断目录或文件是否存在
  • -f 判断是否为文件
  • -r -w -x 判断读写执行权限是否存在

Shell三元运算符语法

  • 逻辑表达式 && echo yes || echo no => 返回true则输出yes,返回false则输出no

流程控制 - if判断

if [ command ];then
    # 符合该条件执行的语句
elif [ command ];then
    # 符合该条件执行的语句
else
    # 符合该条件执行的语句
fi

流程控制 - case

case多分支条件判断

  • 模式匹配
    • [A-Z] 一个大写字母
    • [a-z] 一个小写字母
    • [0-9] 一个数字
    • ? 一个任意字符
    • * 一个任意字符串
  • 注意:大小写分开识别,必须大写在前,小写在后,否则统一识别为小写。
case $1 in 
"1")
    echo "你输入的数字是1"
;;
"2")
    echo "你输入的数字是2"
;;
*)
    echo "你输入的数字是其他"
;;
esac

循环语句 - for循环

for 变量 in 值1 值2 值3 ... | 字符串 | {
   1..100(..2)} # (步长为2)从1到100
do 
    ...
done

示例:

for arg in "$@"
do
    echo "arg : $arg"
done

STRING = "Hello world henry"
for var in $STRING
do
    echo "var:$var"
done
for((初始值;循环控制条件;变量变化))
do 
    ...
done

示例:

for((i=1;i<=10;i++))
do
    echo $[$i*3+1]
done

循环语句 - while循环

while [ 条件表达式 ]
do 
    ...
done
  • continue break 同Java

示例:

i=1
sum=0
while [ $i -le 10 ]
do
    sum=`$[sum+i]`
    ((++i))
done
echo "sum=$sum,i=$i"

补充

  • seq 用于生成从一个数到另一个数之间的所有整数。
  • 示例:seq 1 5seq 5 生成数字1到5。

数据类型

  • 字符串

    • henry 不支持有空格的情况 varA=henry
    • '' 只输出原文,不输出变量 varA='henry pola'
    • "" 输出原文和变量 varB="steven $varA"
    • ````输出命令执行的结果
  • 布尔

    • [ true ] && echo yes || echo no 该命令用于判断条件表达式结果为真or假
    • 逻辑短路: && 只有在前一个值为真值的时候,才会执行后一个命令; || 只有在前一个值返回假值的时候,才会执行后一个命令。

练习

  • 打印九九乘法表

    • for循环

      for i in {
             1..9}
      do
        for j in `seq $i`
        do
          echo -en "$[j]*$[i]=$[i*j]\t"
        done
      echo
      done
      
    • while循环

      i=1
      while [ $i -le 9 ]
      do
        j=1
        while [ $j -le $i ]
        do
          echo -n -e "$i*$j=$[i*j]\t"
          let j++
        done
        let i++
        echo " "
      done
      

后台运行Shell脚本

  • 对守护进程而言,只需在后面加上&就能使其在后台自动运行。但对于非守护进程而言,则需要加上nohup命令使其能够在后台运行。
  • 让程序后台运行
    nohup /root/test.sh &

  • 让程序后台运行,并存储运行输出到指定文件
    nohup COMMAND | SHELL_SCRIPT > out.file 2>&1 &

    Shell exit命令

  • exit 用来退出当前Shell进程,并返回一个退出状态。
  • exit 命令可以接受一个整数值作为参数,代表退出状态;如果不指定,默认状态值是 0
  • exit 退出状态只能是一个介于 0~255 之间的整数(可以通过指定状态区分不同类型的错误),其中只有 0 表示成功,其它值都表示失败
  • echo $? 输出退出状态

Shell RANDOM变量

  • shell有一个环境变量RANDOM,范围是0--32767
  • 产生0-25范围的数:
    $[RANDOM%26]

  • 产生1-68范围的数:
    $[RANDOM%68+1]

编写shell 脚本

  • 要求统计/var/log 目录下有多少个文件,并显示这些文件名

Shell数组

  • 数组中可存放多个值,初始化时不需要定义数组大小
  • 数组元素的下标由0开始
  • Shell 数组用括号来表示,元素用"空格"符号分割开来
    ARRAY_NAME=(VALUE1 ... VALUEN)

  • 获取数组元素
    ${MY_ARRAY[0]}

  • 获取数组中所有数组元素
    ${MY_ARRAY[@]}

Shell函数

  • 函数定义
    function fun()
    fun()
  • 小括号不带任何参数

  • 函数调用
    FUNC_NAME ARG1 ARG2...

  • Shell并不指明定义与调用的顺序。
  • 返回值:为0-255之间的证书,可以显式加return返回,缺省默认为0,等同于exit
  • 返回值扩展:通过var=\func args...`将函数内所有输出内容存到变量var`
  • 一个function最多只能有一个return
  • 例:设计一个计算所有参数总和的函数
    function getsum(){
         
    local sum=0
    for n in $@
    do
    ((sum+=n))
    done
    return $sum
    }
    getsum 10 20 55 15 #调用函数并传递参数
    echo $?
    

TMOUT 超时设定

  • TMOUT=5 # 设置用户输入的超时限制为5秒
  • read -p "请输入数值:" num # 显示提示并等待用户输入
  • 如果用户输入成功,显示输入的数值
    if [ $? -eq 0 ];then
    echo "你输入的数值为: $num"
    else
    echo "输入超时:5秒"
    fi
    

    ping 发送网络请求

  • -c [数量] 表示发送对应数量的请求
  • -W [时间长度] 表示指定了等待主机响应的最长时间
  • 例:ping -c 1 -W 1 &>/dev/null
目录
相关文章
|
2天前
|
Web App开发 缓存 Linux
FFmpeg开发笔记(三十六)Linux环境安装SRS实现视频直播推流
《FFmpeg开发实战》书中第10章提及轻量级流媒体服务器MediaMTX,适合测试RTSP/RTMP协议,但不适合生产环境。推荐使用SRS或ZLMediaKit,其中SRS是国产开源实时视频服务器,支持多种流媒体协议。本文简述在华为欧拉系统上编译安装SRS和FFmpeg的步骤,包括安装依赖、下载源码、配置、编译以及启动SRS服务。此外,还展示了如何通过FFmpeg进行RTMP推流,并使用VLC播放器测试拉流。更多FFmpeg开发内容可参考相关书籍。
11 2
FFmpeg开发笔记(三十六)Linux环境安装SRS实现视频直播推流
|
9天前
|
Linux
FFmpeg开发笔记(三十四)Linux环境给FFmpeg集成libsrt和librist
《FFmpeg开发实战》书中介绍了直播的RTSP和RTMP协议,以及新协议SRT和RIST。SRT是安全可靠传输协议,RIST是可靠的互联网流传输协议,两者于2017年发布。腾讯视频云采用SRT改善推流卡顿。以下是Linux环境下为FFmpeg集成libsrt和librist的步骤:下载安装源码,配置、编译和安装。要启用这些库,需重新配置FFmpeg,添加相关选项,然后编译和安装。成功后,通过`ffmpeg -version`检查版本信息以确认启用SRT和RIST支持。详细过程可参考书中相应章节。
16 1
FFmpeg开发笔记(三十四)Linux环境给FFmpeg集成libsrt和librist
|
10天前
|
Shell Linux
Linux Shell 脚本入门教程:开启你的自动化之旅
Shell是一种计算机程序,它充当了用户与操作系统之间的接口。在Linux系统中,Shell允许用户通过命令行界面(CLI)来控制计算机。Shell脚本则是一种使用Shell语言编写的脚本,它可以自动执行一系列的命令,帮助用户实现任务自动化,提高工作效率。
|
17天前
|
Unix Shell Linux
技术笔记:linux中SIGHUP与nohup的关系
技术笔记:linux中SIGHUP与nohup的关系
13 1
|
3天前
|
Java Shell Linux
【Linux】手把手教你做一个简易shell(命令行解释器)
【Linux】手把手教你做一个简易shell(命令行解释器)
7 0
|
12天前
|
Shell Linux
Linux环境变量之shell中export定义全局变量和echo 变量的区别
Linux环境变量之shell中export定义全局变量和echo 变量的区别
|
17天前
|
Unix 关系型数据库 Linux
技术笔记:linux学习心得
技术笔记:linux学习心得
12 0
|
17天前
|
监控 Unix Shell
探秘GNU/Linux Shell:命令行的魔法世界
探秘GNU/Linux Shell:命令行的魔法世界
20 0
|
17天前
|
机器学习/深度学习 Unix Java
技术笔记:Linux之Shell脚本编程(一)
技术笔记:Linux之Shell脚本编程(一)
21 0
|
2月前
|
Ubuntu Linux Shell
【Linux操作系统】探秘Linux奥秘:shell 编程的解密与实战
【Linux操作系统】探秘Linux奥秘:shell 编程的解密与实战
87 0