【liinux系统(shell脚本):第一章 基础】

Shell

shell的作用

Shell 是一种命令行界面和脚本语言,用于在操作系统中与计算机进行交互和自动化任务。

  1. 与计算机交互: 通过命令行输入命令,执行操作,管理文件和目录等。
  2. 自动化任务: 编写脚本来自动完成重复性任务,比如备份文件、定时运行任务等。
  3. 系统管理: 用于管理和配置计算机系统,安装软件,监控系统状态等。
  4. 文本处理: 处理文本文件,搜索、替换、提取信息等。
  5. 网络操作: 通过命令行进行网络连接、数据传输、下载文件等。
  6. 环境配置: 设置环境变量,定义别名,使工作环境更加适合个人需求。
  7. 启动和停止程序: 用于启动、停止和管理程序和服务。
  8. 调用系统命令: 可以调用系统内置的命令和工具,进行各种操作。

shell脚本

Shell脚本的确是一种按顺序执行命令的程序,它可以将简单的命令和操作组合在一起,实现自动化的任务执行,提高工作效率。同时,你也提到了Shell脚本的处理逻辑,包括顺序执行、选择执行和循环执行,这些是编写Shell脚本时常用的逻辑结构。

Shell脚本
就是将命令按顺序一一列出的程序,最后自动执行。shell脚本将简单的命令组合完成负责的工作,自动化执行命令,提高工作效率,可以用于日常性重复性的运维工作。

处理逻辑:
顺序执行:程序按从上到下的顺序执行
选择执行:程序执行过程中,根据条件的不同选择不同的分支继续执行
循环执行:程序在执行过程中需要重复执行多次某些语句(根据已知次数、已知条件)

shell脚本基本格式

#!/bin/bash
#上面这一行是脚本的shebang,指定要使用的Shell解释器

#注释:用于解释脚本的目的、功能等
#你可以在这里写注释,以及在脚本的其他部分添加注释

#命令部分:
#这里写下你需要执行的命令和操作
#每一行都是一个命令,可以包括参数和选项

#脚本结束
  • #!/bin/bash:这一行是脚本的shebang,它指定了脚本要使用的Shell解释器,这里使用的是Bash。不同的Shell解释器可能会有不同的语法和特性。

  • 注释:用 # 符号开头,用于解释脚本的目的、功能、作者等。注释对脚本的执行没有影响,但对于脚本的可读性和维护非常重要。

  • 命令部分:这里写下你需要执行的命令和操作,每一行都是一个命令,可以包括命令的参数和选项。你可以根据实际需求编写任意数量的命令。

  • 脚本结束:脚本的正文部分结束后,脚本就会执行完毕。

当你编写好脚本后,可以通过终端运行它,例如:

 chmod +x your_script.sh  # 添加执行权限
./your_script.sh        # 运行脚本

shell脚本执行方式

直接运行:在终端中直接输入脚本的文件路径并按回车键执行。

./your_script.sh        #这种方式需要脚本文件有可执行权限,且脚本的 shebang 行正确指定了解释器。
/data/your_script.sh    #绝对路径

通过解释器运行:使用解释器执行脚本,适用于没有添加可执行权限的脚本文件。

bash your_script.sh
sh your_script.sh

作为子进程运行:在命令前加上 bash -c 或 sh -c,将脚本作为子进程运行。

bash -c "./your_script.sh"
sh -c "./your_script.sh"

在终端中逐行运行:将脚本中的命令逐行在终端中输入执行。

通过其他程序调用:可以将脚本作为其他程序的一部分,通过调用这个程序来执行脚本。

在执行脚本时,还可以传递参数给脚本,以便在脚本内部使用。例如:

./your_script.sh arg1 arg2    #在脚本内部,你可以使用 $1、$2 等来引用传递的参数。


bash -n 脚本名称 (绝对路径)    # 检查语法错误
bash -x 脚本名称 (绝对路径)    # 检查逻辑错误

请添加图片描述

请添加图片描述

Shell脚本的变量

变量赋值
引用变量:

my_var="Hello, World!"
echo $my_var

变量命名规则:
变量名只能包含字母、数字和下划线(_),不能以数字开头。
避免使用Shell保留关键字,如if、else、for等作为变量名。
变量名区分大小写。

特殊变量:

  • $0:脚本名称。
  • $1、$2、…:脚本的参数,如 $1 表示第一个参数。
  • $#:传递给脚本的参数数量。
  • $* 或 $@:所有参数。
  • $?:上一个命令的退出状态(0 表示成功,非零表示失败)。
  • $$:当前脚本的进程ID。
  • $USER 或 $LOGNAME:当前用户的用户名。

脚本

#!/bin/bash

name="Alice"
age=30

echo "My name is $name."
echo "I am $age years old."

#计算两个数字之和
num1=10
num2=20
sum=$((num1 + num2))
echo "Sum: $sum"

执行结果

My name is Alice.
I am 30 years old.
Sum: 30

注意:

  • 变量赋值时不能有空格,如 name = “Alice” 是无效的。
  • readonly name 设置为只读变量 ;只读变量不能删除
  • $1-$9:脚本后1-9的位置
    ${10}:脚本后10以上的位置需要借助变量分隔符{},不然会将$1认为是一个位置变量然后输出再加上后面的数字。

测试和操作符

测试的格式

格式1:test 条件表达式

格式2:[ 条件表达式 ] || [ 操作符 文件或目录 ]
[[ ]]加强版[ ],测试支持通配符和正则表达式

测试的选项(操作符)

  • -d 测试是否为文件夹

  • -f 测试是否为普通文件

  • -e 测试文件或目录是否存在

  • -a 测试文件或目录是否存在,不建议使用此选项。取反!=时echo $?是错误的返回值。

  • -L 测试是否为软连接文件

  • -r 判断当前用户是否有读权限,根据实际情况返回结果,不是按ll显示的文件属性权限。

  • -w 判断当前用户是否有写权限,根据实际情况返回结果,不是ll显示的文件属性权限。

  • -x 判断当前用户是否有可执行权限,根据实际情况返回结果,root账户时其他用户有执行权限root账户也有,若其他账户没有执行权限则root也没有。

[root@test1 ~]# [ -d /etc/sysconfig/ ]          
[root@test1 ~]# echo $?
0
[root@test1 ~]# [ -f /etc/sysconfig/ ]
[root@test1 ~]# echo $?
1
[root@localhost ~]# test -e qiuhe.sh &&echo "yes"
yes

注意前后空格

比较数值的操作符

[ 整数1 操作符 整数2 ] 公式

  • -eq:第一个数等于(Equal)第二个数
  • -ne:第一个数不等于(Not Equal)第二个数
  • -gt:第一个数大于(Greater Than)第二个数
  • -lt:第一个数小于(Lesser Than)第二个数
  • -le:第一个数小于或等于(Lesser or Equal)第二个数
  • -ge:第一个数大于或等于(Greater or Equal)第二个数

比较字符串的操作符

  • =:字符串内容相同
  • !=:字符串内容不同,! 号表示相反的意思
  • -z:字符串内容为空
  • -n: 字符是否存在

[ 字符串1 = 字符串2 ] 是否相同

[ 字符串1 != 字符串2 ] 是否不相同

[ -z 字符串 ] 是否为空

[ -n 字符串 ] 字符是否存在

#str1=wang
#str2=zhou
#[ $str1 = $str2 ]
#echo $?
1
#[ $USER = root ]&& echo true
true
#[ $USER != root ]&& echo true

逻辑操作符

格式1:[ 表达式1 ] 操作符 [ 表达式2 ]
格式2:命令1 操作符 命令2

操作符

  • &&或-a 表示且的意思,前面表达式或命令1为真才会执行操作符后面的表达式2或命令2。一假则为假。

  • ||或-o 表示或的意思,前面表达式1或命令1为真则整个表达式为真,前面表达式为假或命令为假才会执行后面的表达式2或命令2 。一真则为真。

  • ! 逻辑否。

相关语句

if语句

if [条件判断]

then (条件1成立则走then)

[执行命令]

elif [条件判断2 ] (可添加多个elif )

then (条件2成立则走then)

[执行命令]

else (所有条件不成立则走else)

[执行命令]

fi (if结束语句)

#!/bin/bash
yum install  httpd -y &>/dev/null
ss -natp |grep ':80' &>/dev/null

if  [  $?  -eq 0 ]; then
  echo  "httpd服务已启动"
  else
    systemctl start httpd
  if  [  $?  -eq 0 ]; then
    echo   "启动成功"
    else
    echo  "启动失败"
  fi
fi

case语句

case 变量 in
模式1)
命令序列1
;;
模式2)
命令序列2
;;
模式3)
命令序列3
;;
*)
默认命令序列
;;
esac

  • 变量 是需要测试的变量。
  • 模式1、模式2、模式3 等是用来匹配的模式。
  • 命令序列1、命令序列2、命令序列3 是在匹配对应模式时执行的命令。 * 是一个通配符,用于匹配所有未被前面模式匹配的情况。
  • esac 是 case 语句的结束标记。
#!/bin/bash

read -p "请输入一个数字: " num

case $num in
    1)
        echo "你输入了数字 1"
        ;;
    2)
        echo "你输入了数字 2"
        ;;
    3|4|5)
        echo "你输入了数字 3、4 或 5"
        ;;
    *)
        echo "你输入了其他数字"
        ;;
esac

脚本常用命令

cut

cut命令:提取想要的信息。

选项:

-d 指定分隔符 例如 cut -d ":"指定:为分隔符。

-f 选择第几列 例如 cut -f3 取第三列,-f1,3取第1列和第三列,-f1-3取1-3列。

sort

sort命令:排序

选项:

-r 执行反方向(由上至下)整理

-n 按数字大小排序,默认第一列默认按字母顺序

-t 指定分隔符

-k 指定列 ,例如 -k3

cal

cal命令:显示当月日历。

选项:

cal 12 显示本年整年日历

cal 某年 显示此年完整日历

data

date命令:查看时间,显示格式为,星期 月 日 时分秒 年

选项:

+%F 输出格式年-月-日,注意%在crontab定时中不能直接使用,需要转义

+%T 输出格式时:分:秒, 注意%在crontab定时中不能直接使用,需要转义

#!/bin/bash
use=`df -h|tr -s ' '|cut -d ' ' -f5|tail -n +2|tr -d %|sort -rn|head -n 1`

[ $use -gt 80 ] && echo "disk will be full,please check it" || echo "磁盘正常"
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值