[华为云在线课程][Shell脚本编程基础][第二章Shell脚本语言的基本用法][1基本结构][学习笔记]

举报
John2021 发表于 2022/04/14 17:07:23 2022/04/14
【摘要】 shell脚本的用途1,将简单的命令组合完成复杂的工作,自动化执行命令提高工作效率2,减少手工命令的重复输入,一定程度上避免人为错误3,将软件或应用的安装及配置实现标准化4,用于实现日常性的,重复性的运维工作,如:文件打包压缩备份,监控系统状态运行状态并实现告警等 shell脚本基本结构shell脚本编程:是基于过程式、解释执行的语言编程语言的基本结构:各种系统命令的组合数据存储:变量、数...

shell脚本的用途

1,将简单的命令组合完成复杂的工作,自动化执行命令提高工作效率
2,减少手工命令的重复输入,一定程度上避免人为错误
3,将软件或应用的安装及配置实现标准化
4,用于实现日常性的,重复性的运维工作,如:文件打包压缩备份,监控系统状态运行状态并实现告警等

shell脚本基本结构

shell脚本编程:是基于过程式、解释执行的语言
编程语言的基本结构:

  • 各种系统命令的组合
  • 数据存储:变量、数组
  • 表达式:a+b
  • 控制语句if

shell脚本:包含一些命令或声明,并符合一定格式的文本文件
格式要求:首行shebang机制

#!/bin/bash
#!/usr/bin/python
#!/usr/bin/perl

shell脚本创建过程

第一步:使用文本编辑器来创建文本文件
第一行必须包括shell声明序列:#!
例子:

#!/bin/bash

添加注释,注释以#开头
第二步:加执行权限
给与执行权限,在命令行上指定脚本的绝对或相对路径
第三步:运行脚本
直接运行编译器,将脚本作为解释器程序的参数运行

shell脚本注释规范

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

第一个脚本

#!SHEBANG
CONFIGURATION_VARIABLES
FUNCTION_DEFINITIONS
MAIN_CODE

例子:第一个shell脚本hello world
参考文档:https://zh.wikipedia.org/wiki/Hello_World
远程执行shell文件注意:
坑一:如果执行错误并提示curl: (7) Failed connect to 10.0.0.110:80; No route to host。原因就是没有关闭防火墙。需要执行systemctl stop/disable firewalld关闭防火墙。
坑二:关闭防火墙后执行出现如下提示,表示没有关闭selinux

[root@localhost ~]# curl http://10.0.0.110/helloworld.sh
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>403 Forbidden</title>
</head><body>
<h1>Forbidden</h1>
<p>You don't have permission to access /helloworld.sh
on this server.</p>
</body></html>

关闭方法:
1,临时关闭,在终端输入"setenforce 0"2,永久关闭,在终端输入"vim /etc/selinux/config",将SELINUX的值改为"disalbed"

坑三:如果能ping,却不能curl,记得打开httpd服务

[root@localhost ~]# curl 10.0.0.110
curl: (7) Failed connect to 10.0.0.110:80; Connection refused
[root@localhost ~]# systemctl start httpd
#!/bin/bash
#经典写法
echo "Hello World!";
#流行写法
echo 'Hello World!';

#--------------------------------------
#执行方法1
[root@localhost Code]# bash helloworld.sh
#执行方法2
[root@localhost Code]# cat helloworld.sh | bash
#执行方法3
[root@localhost Code]# bash < helloworld.sh
#执行方法4
[root@localhost Code]# chmod +x helloworld.sh
#执行方法5(远程执行)
[root@localhost Code]#yum install httpd -y
[root@localhost Code]#systemctl start httpd
[root@localhost Code]#mv /data/hello.sh /var/www/html/

[root@localhost ~]# curl 10.0.0.110/helloworld.sh | bash
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100    32  100    32    0     0  19300      0 --:--:-- --:--:-- --:--:-- 32000
hello world
[root@localhost ~]# curl 10.0.0.110/helloworld.sh
#!/bin/bash
echo "hello world";
[root@localhost ~]# curl -s 10.0.0.110/helloworld.sh | bash
hello world
[root@localhost ~]# curl 10.0.0.110/helloworld.sh 2>/dev/null | bash
hello world
[root@localhost ~]# curl 10.0.0.110/helloworld.sh >/dev/null | bash
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100    32  100    32    0     0  23494      0 --:--:-- --:--:-- --:--:-- 32000

#绝对路径
[root@localhost Code]# cd ..
[root@localhost hello]# Code/helloworld.sh
#相对路径
[root@localhost Code]# ./helloworld.sh

例子:备份脚本

#!/bin/bash
echo -e "\033[1;32mStarting backup...\033[0m"
sleep 2
cp /etc/vimrc /home/hello/Code/vimrc\-`date +%F`
echo -e "\033[1;32mBackup is finished\033[0m"

[root@localhost Code]# ./backup.sh
Starting backup...
Backup is finished
[root@localhost Code]# ll
total 8
-rwxr-xr-x 1 root root  162 Apr 14 16:39 backup.sh
-rw-r--r-- 1 root root 2062 Apr 14 16:40 vimrc-2022-04-14

shell脚本调试

只检测脚本中的语法错误,但无法检查出命令错误,但不真正执行脚本

bash -n /path/to/some_script

调试并执行

bash -x /path/to/some_script

例子:检查语法错误

#!/bin/bash
echo -e "\033[1;32mStarting backup...\033[0m"
sleep 2
cp /etc/vimrc /home/hello/Code/vimrc\-`date +%F`
echo -e "\033[1;32mBackup is finished\033[0m")))

[root@localhost Code]# bash -n backup.sh
backup.sh: line 5: syntax error near unexpected token `)'
backup.sh: line 5: `echo -e "\033[1;32mBackup is finished\033[0m")))'

例子:调试并执行

#!/bin/bash
echo -e "\033[1;32mStarting backup...\033[0m"
sleep 2
cp /etc/vimrc /home/hello/Code/vimrc\-`date +%F`
cho -e "\033[1;32mBackup is finished\033[0m"

[root@localhost Code]# bash -x backup.sh
+ echo -e '\033[1;32mStarting backup...\033[0m'
Starting backup...
+ sleep 2
++ date +%F
+ cp /etc/vimrc /home/hello/Code/vimrc-2022-04-14
+ cho -e '\033[1;32mBackup is finished\033[0m'
backup.sh: line 5: cho: command not found

总结:脚本错误常见的有三种

  • 语法错误,会导致后续的命令不继续执行,可以用bash -n检查错误,提示的出错行数不一定是准确的
  • 命令错误,默认后续的命令还会继续执行,用bash -n无法检查出来,可以使用bash -x进行观察
  • 逻辑错误:只能使用bash -x进行观察
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。