1.shell 脚本基础

作用:介于系统内核与用户之间,负责解释命令行

1.1.第一个 shell 脚本

vim first.sh

cd /boot/
pwd
ls -lh vml*z

赋予可执行权限:chmod +x firest.sh

执行脚本方式(三种)

./first.sh

sh /first.sh

source /first.sh

完善脚本构成:脚本声明;注释信息;可执行语句

vim /first.sh

#!/bin/bash
# This is my first Shell-Script.
cd /boot
echo "当前的目录位于:"
pwd
echo "其中以 vml 开头的文件包括:"
ls -lh vml*

1.2.重定向与管道操作

交互式硬件设备

  标准输入:从该设备接收用户输入的数据

  标准输出:通过该设备向用户输出数据

  标准错误:通过该设备报告执行出错信息

重定向操作

管道符:将左侧的命令输出结果,作为右侧命令的处理对象

1.3.变量

类型:

  自定义变量

  环境变量:用于设置工作环境

  位置变量:通过命令行给脚本程序传递参数

  预定义变量:Bash 中内置的一类变量,不能直接修改

赋值时使用引号:

  双引号:允许通过 $ 符号引用其他变量值

  单引号:禁止引用其他变量值,$ 视为普通字符

  反引号:命令替换,提取命令执行后的输出结果

从键盘输入内容为变量赋值:

read [-p "提示内容"] 变量名

常用运算符:

+、-、\*、/、%(求模、取余运算)

环境变量:

配置文件:/etc/profile、~/.bash_profile

常见环境变量:

  PWD、PATH、USER、SHELL、HOME

位置变量:

表示为 $n(n为 1-9 的数字)

预定义变量:

$#:命令行中位置变量的个数
$*:所有位置变量的内容
$?:上一条命令执行后返回的状态,当返回状态值为 0 时表示执行正常,非 0 值表示执行异常或出错
$0:当前执行的进程/程序名

1.4.一键搭建 dhcp 服务

vim /root/install-dhcp.sh

#!/bin/bash
umount /dev/sr0
mount /dev/sr0 /media
rm -rf /etc/yum.repos.d/*
echo "[test-sh]" >> /etc/yum.repos.d/test.repo
echo "name=test" >> /etc/yum.repos.d/test.repo
echo "baseurl=file:///media" >> /etc/yum.repos.d/test.repo
echo "enable=1" >> /etc/yum.repos.d/test.repo
echo "gpgcheck=0" >> /ect/yum.repos.d/test.repo
yum -y install dhcp*

read -p "subnet:" NET
read -p "network:" MASK
read -p "range:" RANGE
read -p "dns1:" DNS1
read -p "dns2:" DNS2
read -p "gateway:" GATE
read -p "broadcast:" BROA
echo "subnet $NET netmask $MASK {" > /etc/dhcp/dhcpd.conf
echo "range $RANGE;" >> /etc/dhcp/dhcpd.conf #指定IP地址范围
echo "option domain-name-servers $DNS1,$DNS2;" >> /etc/dhcp/dhcpd.conf
echo 'option domain-name "internal.example.org";' >> /etc/dhcp/dhcpd.conf
echo "option routes $GATE;" >> /etc/dhcp/dhcpd.conf
echo "option broadcast-address $BROA;" >> /etc/dhcp/dhcpd.conf
echo "default-lease-time 600;" >> /etc/dhcp/dhcpd.conf
echo "max-lease-time 7200;" >> /etc/dhcp/dhcpd.conf
echo "}" >> /etc/dhcp/dhcpd.conf
systemctl start dhcpd

1.5.test 命令

测试特定的表达式是否成立,当条件成立时,测试语句的返回值为 0,否则为其他数值

格式1:test 条件表达式

格式2:[ 条件表达式 ](至少应该有一个空格)

文件测试

[ 操作符 文件或目录 ]

常用测试操作符:

-d:测试是否为目录(Directory)
-e:测试目录或文件是否存在(Exist)
-f:测试是否为文件(File)
-r:测试当前用户是否有权限读取(Read)
-w:测试当前用户是否有权限写入(Write)
-x:测试当前用户是否有权限执行(excute)

[ -d /media/cdrom ]

echo $?(返回 0 表示条件成立,否则不成立)

[ -d /media/cdrom ] && echo "YES"

1.6.整数值比较

[ 整数1 操作符 整数2 ]

-eq:等于
-ne:不等于
-gt:大于
-lt:小于
-ge:大于或等于
-le:小于或等于

1.7.字符串比较

格式1:[ 字符串1 = 字符串2 ] 或者 [字符串1 != 字符串2 ]

格式2:[ -z 字符串 ]

=:字符串内容相同
!=:字符串内容不同
-z:字符串内容为空

2.shell 脚本分支语法

2.1.if 语句

if 条件测试操作
then 命令序列
elif 条件判断
then 命令序列
else
命令执行语句
fi

3.shell 脚本循环语法

3.1.while 循环

while 条件测试操作
do
命令序列
done

3.2.for 循环

for 变量名 in 取值列表
do
命令序列
done

3.3.case 语句

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

4.正则表达式使用

4.1.正则表达式组成

普通字符:大小写字母、数字、标点符号及其他一些符号

元字符:在正则表达式中具有特殊意义的专用字符

常见元字符:

^:开头
$:结尾
.:单个任意字符
\:使右侧正则符号失去含义,变为字符
*:匹配左侧表达式 0 次到任意次
[]:范围选择匹配符,匹配的信息不再是任意,由 [] 内信息决定
{}:匹配左侧表达式的个数,在 shell 中需要转义:\{\}
{n}:匹配左侧表达式 n 个
{n,}:匹配左侧表达式 n 个到任意个
{n,m}:匹配左侧表达式 n 个到 m 个(最少 n 个,最多 m 个)

IP地址正则:[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}

扩展
+:匹配左侧表达式一个或多个
?:匹配零个或一个
|:多个信息中匹配某一个
():查找 “组” 字符串
()+:辨别多个重复的组

\t:表示横向制表符,tab 大空格
\n:换行符

8、shell 脚本的更多相关文章

  1. 第一个shell脚本

    打开文本编辑器,新建一个文件,扩展名为sh(sh代表shell),扩展名并不影响脚本执行,见名知意就好. #!/bin/bash echo "Hello World !" &quo ...

  2. 使用C#给Linux写Shell脚本

    在这个逼格决定人格,鄙视链盛行的年头,尤其是咱们IT界,请问您今天鄙视与被鄙视的次数分别是多少?如果手中没有一点压箱的本事,那就只有看的份了.今天我们也要提升下自己的格调,学习些脑洞大开的东西,学完之 ...

  3. shell脚本规划化模板

    shell脚本规划化模板 Linux运维过程中,shell脚本是不可缺少的工具,但是每个运维人员编程的习惯都不一样,很多时候就是实现某个功能,写出来的脚本都是烂七八糟的.脚本必须规范化,应该从以后几个 ...

  4. Shell脚本编程30分钟入门

    Shell脚本编程30分钟入门 转载地址: Shell脚本编程30分钟入门 什么是Shell脚本 示例 看个例子吧: #!/bin/sh cd ~ mkdir shell_tut cd shell_t ...

  5. Linux Shell脚本逻辑操作符简介

    在写程序时,会用到条件判断,测试条件是否成立.很多时候,判断条件是多个的,这个时候需要用到逻辑操作符.shell脚本中常用的有哪些逻辑操作符呢? 1.逻辑与: -a 格式: conditon1 -a ...

  6. Linux shell脚本编程(三)

    Linux shell脚本编程 流程控制: 循环语句:for,while,until while循环: while CONDITION; do 循环体 done 进入条件:当CONDITION为“真” ...

  7. Linux shell脚本编程(二)

    Linux shell脚本编程(二) 练习:求100以内所有偶数之和; 使用至少三种方法实现; 示例1: #!/bin/bash # declare -i sum=0 #声明一个变量求和,初始值为0 ...

  8. Linux shell脚本编程(一)

    Linux shell脚本编程: 守护进程,服务进程:启动?开机时自动启动: 交互式进程:shell应用程序 广义:GUI,CLI GUI: CLI: 词法分析:命令,选项,参数 内建命令: 外部命令 ...

  9. 详解Linux交互式shell脚本中创建对话框实例教程_linux服务器

    本教程我们通过实现来讲讲Linux交互式shell脚本中创建各种各样对话框,对话框在Linux中可以友好的提示操作者,感兴趣的朋友可以参考学习一下. 当你在终端环境下安装新的软件时,你可以经常看到信息 ...

  10. shell 脚本之循环使用 for while 详解

    任何一种编程语言中循环是比不可少的,当然 shell 脚本也少不了循环语句,包括 for 语句. while 语句.文中主要以实际用例来说明 for while 都有哪些常见的使用方法和技巧. 一.f ...

随机推荐

  1. KingbaseES V8R3集群运维案例---进程内核参数配置集群启动故障

    案例说明: KingbaseES V8R3集群在部署时需要配置与进程间通讯(IPC)相关的内核参数,如果缺失配置或配置错误,kingbasecluster服务在启动过程中将因为内核参数配置错误导致启动 ...

  2. apue 文章集锦

    与 apue 相关的一系列文章比较庞杂,按原书目录整理了一下,形成目录,方便系统性阅读. 另外这些文章是在我快读完的时候开始写的,之前的一些章节还多有遗漏,后面慢慢补上. chapter 1: UNI ...

  3. 链表队列(LinkedListQueue)

    栈操作 入队 template<typename T> void LinkedListQueue<T>::enqueue(T e) { if (tail == nullptr) ...

  4. #线段树合并#洛谷 3224 [HNOI2012]永无乡

    题目 分析 和主席树不同的是,线段树合并后原树的信息不会保留, 这样就保证空间和常数都比较小,这题比较裸,直接上代码 代码 #include <cstdio> #include <c ...

  5. java内存模型(jmm)概念初探

    1.和java内存结构的区别: 很多人会把jmm和Java内存结构搞混,网上搜到的一些文章也是如此,java内存结构就是我们常说的堆,栈,方法区,程序计数器..., 当jvm虚拟机启动的时候,会初始化 ...

  6. Native Rawfile开发指导

      场景介绍 开发者可以通过本指导了解在HarmonyOS应用中,如何使用Native Rawfile接口操作Rawfile目录和文件.功能包括遍历.打开.搜索.读取和关闭Rawfile. 接口说明 ...

  7. 给蚂蚁金服 antv 提个 PR, 以为是改个错别字, 未曾想背后的原因竟如此复杂!

    前言 什么? 你不了解G2Plot? 没关系, 今天咱们要分享的内容和G2Plot的关系, 就像雷锋和雷峰塔的关系. 因此, 不必担心听不懂. 我一直觉得, 如果我写的文章有人看不懂, 那一定是我写的 ...

  8. JavaScript中字符串小知识

    1. 字符串是不可变的 字符串一旦创建就是不可变的,后续的修改都是新建一个新的字符串而不是在原有的字符串上修改 // 在内存中开辟 可以存放五个字母的空间 str指向该空间 let str = 'fi ...

  9. 技术人如何"结构化"高效思考?

    1 前言 你是否在解决问题时,常常觉得脑子很乱,很多零散的信息迸发出来,但就是无法形成解决方案. 之所以这样,原因就在于,我们的大脑处理不了太多零散而复杂的信息.人类大脑在处理信息的时候,有两个规律: ...

  10. D365调试进入系统类方法

    在生成InventDIMID时,虽然设置了InventDIMID的Number sequence为自定义的Format,但是总是不按指定的Number sequence产生InventDIMID Di ...