shell脚本编程基础

本文涉及的产品
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析 DNS,旗舰版 1个月
简介:

 Shell本身是一个用C语言编写的程序,它是用户使用Linux的桥梁。Shell既是一种命令语言,又是一种程序设计语言。作为命令语言,它交互式地解释和执行用户输入的命令;作为程序设计语言,它定义了各种变量和参数,并提供了许多在高级语言中才具有的控制结构,包括循环和分支

  对于用户来说,shell是最重要的实用程序,深入了解和熟练掌握shell的特性极其使用方法,是用好Linux系统的关键。


※ shell 脚本基础:

 包含一些命令或声明,并符合一定格式的文本文件
 格式要求:首行shebang 机制
          #!/bin/bash
          #!/usr/bin/python
          #!/usr/bin/perl
  shell 脚本的用途有:
      自动化常用命令
      执行系统管理和故障排除
      创建简单的应用程序
      处理文本或文件


※创建shell脚本

  第一步:使用文本编辑器来创建文本文件
   ·第一行必须包括shell 声明序列:#!
    #!/bin/bash
   ·添加注释  注释以# 开头
   ·第二步:运行脚本
   ·给予执行权限,在命令行上指定脚本的绝对或相对路径
   ·直接运行解释器,将脚本作为解释器程序的参数运行

  脚本代码开头约定
    1 、第一行一般为调用使用的语言
    2 、程序名,避免更改文件名为无法找到正确的文件
    3 、版本号
    4 、更改后的时间
    5 、作者相关信息
    6 、该程序的作用,及注意事项
    7 、最后是各版本的更新简要说明 

※ 

  检测脚本中的语法错误
   bash -n /path/to/some_script
  调试 执行
   bash -x /path/to/some_script

※ 本地变量

    变量赋值:name=‘value’

 ※   环境变量

      变量声明、赋值: export name=VALUE     

               declare -x name=VALUE
       变量引用:    name,{name}
       显示所有环境变量:
                env
                 printenv
                export
                declare -x
        删除变量 :   unset name

※ 只读变量
   readonly varname
   declare -r varname
  查看所有的只读变量
         readonly -p 

※    位置变量
位置变量:在脚本代码中调用通过命令行传递给脚本的参数
1,2, ...:对应第1、第2等参数,shift [n]换位置
0:*: 传递给脚本的所有参数,全部参数合为一个字符串
@:#: 传递给脚本的参数的个数
@* 只在被双引号包起来的时候才会有差异
set -- 清空所有位置变量
注意:当位置参数达到10以后,要加大括号。

※ bash中的算术运算:help let
+, -, *, /, %取模(取余), **(乘方)在bc当中乘方是^
实现算术运算:
(1) let var=算术表达式
(2) var=[](3)var=((算术表达式))
(4) var=(exprarg1arg2arg3...)\*exprx \* $y
l
(5) declare –i var = 数值
(6) echo ‘算术表达式’ | bc


※  逻辑运算

与:
 真与真  真
 真与假  假
 假与真  假
 假与假  假
只要有一个假则为假
短路与 前一个为假,则不再判断第二个值



 真或真 真
 真或假 真
 假或真 真
 假或假 假
只要有一个真则为真
短路或,前一个为真,则不再判断第二个值 

※ 条件性的执行操作

  根据退出状态而定,命令可以有条件地运行
     && 代表条件性的AND THEN
     || 代表条件性的OR ELSE

※bash的数值测试

  -gt 是否大于
  -ge 是否大于等于
  -eq 是否等于
  -ne 是否不等于
  -lt 是否小于
  -le 是否小于等于

  字符串测试:
   == 是否等于
   > ascii 码是否大于ascii码 码
   < 是否 小于
   != 是否 不等于
   =~ 左侧 字符串是否能够被右侧的PATTERN所 所 匹配
   注意: 此表达式一般用于` `,扩展的正则表达式

      用于字符串比较时的用到的操作数都应该使用引号

※ 习题

1.编写脚本/root/bin/backup.sh,可实现将/etc/目录备份到/root/etcYYYY-mm-dd中

wKioL1mFkPmDt47QAABHXSkgqXw339.png






解析:-a保留所有的属性权限等  $引用变量   date +%F :年月日


2.编写脚本/root/bin/sumid.sh ,计算/etc/passwd 文件中的第10 个用户和第20 用户的ID之和

wKioL1mFy0Gh89HMAABAWpCEHpU447.png

解析:这道题可以用head和tail来截取第十行和第二十行;也可以用cat -n给文件标注行数,再用grep截取所需的行,除此之外,都用到tr和cut.但我在做这道题时等号前留了空格,于是脚本就一直出现错误。$1是位置参数。


3 、编写脚本/root/bin/sumfile.sh, 统计/etc, /var, /usr目录中共有多少个一级子目录和文件

wKioL1mFvXuSGRMvAABilZnVb28168.png

解析:此题用了位置参数1,2,$3,还用了引用变量。


4.编写脚本/root/bin/sumspace.sh ,传递两个文件路径作为参数给脚本,计算这两个文件中所有空白行之和。

wKiom1mFw_DSW8-pAAA4d71pFqM790.png

5.编写脚本/root/bin/argsnum.sh ,接受一个文件路径作为参数;如果参数个数小于1 ,则提示用户“至少应该给一个参数”,并立即退出;如果参数个数不小于1 ,则显示第一个参数所指向的文件中的空白行数

答案:[[ 1 == "" ]]&& echo "至少应该给一个参数" && exit ||grep -c "^[[:space:]]&"1|wc -l

解析:此题用到了位置参数$1;条件性执行操作:&&: 条件性的and then

||:条件性的or else


2.编写脚本/root/bin/hostping.sh ,接受一个主机的IPv4地址做为参数,测试是否可连通。如果能ping 通,则提示用户“该IP 地址可访问” ;如果不可ping通,则提示用户“该IP地 地址不可访问”

答案:ping -c1 -w1 $1 &> /dev/null && echo 该ip地址可访问||echo 该ip地址不可访问

解析:-c1:只ping一个 -w1:超时等待一秒 如果ip地址ping得通的话就导给垃圾桶,不通的话就提示用户。


7.编写脚本/root/bin/checkdisk.sh ,检查磁盘分区空间和inode 使用率,如果超过80% ,就发广播警告空间将满。

答案:disk=`df|grep "/dev/sd"|sort -nr -k5|tr -s " " "%"|cut -d% -f5|head -1`
inode=`df -i|grep "/dev/sd"|sort -nr -k5|tr -s " " "%"|cut -d% -f5|head -1`
[[ disk -gt 80 ]] && wall the disk will full||echo the disk is not more than 80%  [[inode -gt 80 ]] && wall the inode will full||echo the inode is not more than 80%

解析:与上面几题相比,此题用到了数值测试:-gt 是否大于 其他的用到的都是文本截取工具之类的。



本文转自    honeyorange   51CTO博客,原文链接:http://blog.51cto.com/13172732/1953909
目录
打赏
0
0
0
0
95
分享
相关文章
MySQL 备份 Shell 脚本:支持远程同步与阿里云 OSS 备份
一款自动化 MySQL 备份 Shell 脚本,支持本地存储、远程服务器同步(SSH+rsync)、阿里云 OSS 备份,并自动清理过期备份。适用于数据库管理员和开发者,帮助确保数据安全。
|
9天前
|
在Linux、CentOS7中设置shell脚本开机自启动服务
以上就是在CentOS 7中设置shell脚本开机自启动服务的全部步骤。希望这个指南能帮助你更好地管理你的Linux系统。
64 25
|
3月前
|
【linux】Shell脚本中basename和dirname的详细用法教程
本文详细介绍了Linux Shell脚本中 `basename`和 `dirname`命令的用法,包括去除路径信息、去除后缀、批量处理文件名和路径等。同时,通过文件备份和日志文件分离的实践应用,展示了这两个命令在实际脚本中的应用场景。希望本文能帮助您更好地理解和应用 `basename`和 `dirname`命令,提高Shell脚本编写的效率和灵活性。
156 32
定期备份数据库:基于 Shell 脚本的自动化方案
本篇文章分享一个简单的 Shell 脚本,用于定期备份 MySQL 数据库,并自动将备份传输到远程服务器,帮助防止数据丢失。
|
7月前
|
一个用于添加/删除定时任务的shell脚本
一个用于添加/删除定时任务的shell脚本
197 1
多种脚本批量下载 Docker 镜像:Shell、PowerShell、Node.js 和 C#
本项目提供多种脚本(Shell、PowerShell、Node.js 和 C#)用于批量下载 Docker 镜像。配置文件 `docker-images.txt` 列出需要下载的镜像及其标签。各脚本首先检查 Docker 是否安装,接着读取配置文件并逐行处理,跳过空行和注释行,提取镜像名称和标签,调用 `docker pull` 命令下载镜像,并输出下载结果。使用时需创建配置文件并运行相应脚本。C# 版本需安装 .NET 8 runtime。
177 3
|
6月前
|
Shell脚本要点和难点以及具体应用和优缺点介绍
Shell脚本在系统管理和自动化任务中扮演着重要角色。尽管存在调试困难、可读性差等问题,但其简洁高效、易于学习和强大的功能使其在许多场景中不可或缺。通过掌握Shell脚本的基本语法、常用命令和函数,并了解其优缺点,开发者可以编写出高效的脚本来完成各种任务,提高工作效率。希望本文能为您在Shell脚本编写和应用中提供有价值的参考和指导。
233 1
ubuntu/debian shell 脚本自动配置 gitea git 仓库
这是一个自动配置 Gitea Git 仓库的 Shell 脚本,支持 Ubuntu 20+ 和 Debian 12+ 系统。脚本会创建必要的目录、下载并安装 Gitea,创建 Gitea 用户和服务,确保 Gitea 在系统启动时自动运行。用户可以选择从官方或小绿叶技术博客下载安装包。
219 2
ip和ip网段攻击拦截系统-绿叶结界防火墙系统shell脚本
这是一个名为“小绿叶技术博客扫段攻击拦截系统”的Bash脚本,用于监控和拦截TCP攻击。通过抓取网络数据包监控可疑IP,并利用iptables和firewalld防火墙规则对这些IP进行拦截。同时,该系统能够查询数据库中的白名单,确保合法IP不受影响。此外,它还具备日志记录功能,以便于后续分析和审计。
139 6
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等