IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 系统运维 -> shell 脚本编程 -> 正文阅读

[系统运维]shell 脚本编程

shell编程(脚本编程)

#!/usr/bin/bash
echo "hello"
exit 0    

在这里插入图片描述

为脚本文件更改权限之后,加上执行权限,就可以当做可执行文件来执行,但是区别于.exe文件
在这里插入图片描述

C/C++ 编译型:xxx.c 编译生成二进制可执行程序,直接运行可执行程序(运行效率高,开发效率低)

shell 解释型:需要解释器,通过解释器解释执行(开发效率高,运行效率低)

当对性能不作要求的时候,我们使用解释型语言会更加高效
写的是一个脚本文件,但是运行的是一个解释器,通过解释器来解释脚本文件;脚本文件是文本文件,可执行程序是脚本解释器,将脚本程序当做参数,传给脚本解释器来进行运行.如果需要知道脚本文件执行时的进程号,实际上就是脚本解释器的进程号。

脚本编程的相关知识点

变量

本地变量

在传统的C/C++等编译型语言当中,我们的变量和值的关系是每一个值和变量(地址空间结合),每一个变量都有一个固定的地址,但是在解释型语言中,当变量被赋予不同的值的时候,他的地址也会随之改变,不可将两种不同类型的语言相提并论(内存分布方面);解释型语言没有类型的区别

#! /usr/bin/bash

str=hello
val=99
mystr=$val#用val给mystr赋值
#井号为注释标准
#echo是输出,相当于printf
#在赋值的时候加不加双引号是都可以的,且等号的两边不能有空格
#如果要原样输出,请使用单引号

#在键盘获取

echo ”input“
read line
echo "line=$line"

echo 'val=$val'
echo “val=$valecho “str=$strexit 0

在这里插入图片描述

环境变量

在当前环境中已经定义好的可以直接使用,例如 PATH

#!/usr/bin/bash

echo "$PATH"#最常见环境变量,可执行程序存放的地点
echo "$PS1"#命令提示符
echo “\$0=$0#脚本的名字
echo "\$#=$#"#传递给脚本的参数个数
echo "\$$=$$"#shell脚本的进程号,脚本程序通常会用他来生成一个唯一的临时文件,如/tmp/tmpfile
echo "\$1=$1"#第一个参数
echo “\$2=$2#第二个参数,$后面跟的几就是第几个参数

参数变量

条件

字符串

#! /usr/bin/bash

echo "input"
read line
#判断字符串相等 等号两边有空格
if [ "$line" = "123" ]
then
	echo "=="
fi

#判断是否为空

if [ -n "$line" ]
then 
	echo "值 $line"
else 
	echo "null"
fi

算数比较

#!/usr/bin/bash
echo "input"
read line

if [ "$line" -lt 100 ]
then
	echo "$line < 100"
fi

if [ "$line" -lt 0] || ["$line" -gt 100 ] 
then
	echo "成绩不合法"
fi

文件测试

#文件检查命令test -f <filename>,检查文件是否存在
if test -f fred.c#开始
then
...
fi#结束

或者写成:

if [ -f fred.c ]
then
...
fi
#! /usr/bin/bash
#检测文件是否存在
echo "input"
read filename
if [ -f "$filename" ]
then
	echo "$filename 存在"
else
	echo "$filename 不存在"
fi


#if test -f $filename
#then
	echo a.py存在
#fi

#查看文件类型
if [ -d "$filename" ]
then
	echo "$fielname 是一个文件夹"
else [ -f $filename ]
	echo "$filename 是普通文件"
else
	echo "$fielname 不存在"
fi
#! /usr/bin/bash
i=1
let "i+=1"
echo "i=$i"

循环 for while until

for:循环的次数由值的个数决定

#!/usr/bin/bash

for i in 1,2,3
do 
echo "i=$i"
sleep 1

done

在这里插入图片描述

#!/usr/bin/bash

for name in &(ls)
do
echo "$name"
done

在这里插入图片描述

while:满足判断条件就执行循环

在这里插入图片描述

在这里插入图片描述

Until:不满足条件就执行循环

#! /usr/bin/bash

until [ -f file.txt ]
do
    echo "not find file"
    sleep
done

以上代码没有找到file.txt就执行循环体内的代码

在脚本语言中,我们可以直接执行命令,让命令单独存放一行,他就会被当做一个命令被执行了

在这里插入图片描述

在这里插入图片描述

我们如何将命令执行的结果当做值赋给我们的变量

#! /usr/bin/bash

str=$(ls)
echo "$str"

在这里插入图片描述

case

在这里插入图片描述

在这里插入图片描述

函数

shell编程中函数没有返回值类型,我们可以认为他是所有类型都可以返回的,因为在shell中只要定义了变量不管是在函数中还是在脚本中,只要不做特殊声明,这个变量就会一直存在在脚本的运行周期中,所以有没有返回值没有太大的区别,因为我们可以直接调用局部变量。

#! /usr/bin/bash

fun()
{
	echo "fun run"
	str="hello"
	echo "str=$str"
	echo "\$#=$#"
	echo "\$1=$1"
	echo "\$2=$2"
}

my_add()
{
	echo "\$#=$#"
	echo "\$1=$1"
	echo "\$2=$2"
	
	res=`expr $1+$2`
	return res
	#	其实有没有return都是一样的,因为res现在全局可用
}

my_add 1 3
echo "\$?=$?"
#   $? 作用是取得上一行的运行结果,如果我们继续执行这一语句
echo "\$?=$?"
#此时就会输出0 因为echo的运行结果被认为是始终成功的,而在shell中,成功被当作是0

当我们在shell函数中定义过变量之后,要将不用的变量unset掉,以防止影响后面的脚本运行,或者通过声明local的方式将变量声明为函数内可用即可。

脚本调用C语言,C语言调用脚本

脚本调用C语言很简单,本来脚本程序中运行的就是可执行命令,当我们把C语言编译之后就会生成一个可执行命令,直接在脚本程序中写入该可执行文件,加上可执行程序的路径,我们就可以完成在脚本程序中调用C语言了。

使用C语言调用脚本就相对来说麻烦一点了,我们要知道脚本语言是可以当做命令来运行的,那么想一下在我们的C语言程序中,如何在程序执行过程中调用命令呢?想必大家不难想到,通过进程替换呗 ,当我们要调用脚本程序的时候直接通过进程复制+进程替换的方式将一个子进程替换为我们要执行的脚本程序,这样就可以完成在C语言中调用脚本程序了。

函数内可用即可。

脚本调用C语言,C语言调用脚本

脚本调用C语言很简单,本来脚本程序中运行的就是可执行命令,当我们把C语言编译之后就会生成一个可执行命令,直接在脚本程序中写入该可执行文件,加上可执行程序的路径,我们就可以完成在脚本程序中调用C语言了。

使用C语言调用脚本就相对来说麻烦一点了,我们要知道脚本语言是可以当做命令来运行的,那么想一下在我们的C语言程序中,如何在程序执行过程中调用命令呢?想必大家不难想到,通过进程替换呗 ,当我们要调用脚本程序的时候直接通过进程复制+进程替换的方式将一个子进程替换为我们要执行的脚本程序,这样就可以完成在C语言中调用脚本程序了。

写在最后的话

shell脚本编程的语法规则相对来说较为简单,想要用好脚本编程我们要进行命令的积累,因为脚本编程主要就是命令的集合应用,只有我们掌握更多的命令,才能更加得心应手的使用shell脚本编程。

  系统运维 最新文章
配置小型公司网络WLAN基本业务(AC通过三层
如何在交付运维过程中建立风险底线意识,提
快速传输大文件,怎么通过网络传大文件给对
从游戏服务端角度分析移动同步(状态同步)
MySQL使用MyCat实现分库分表
如何用DWDM射频光纤技术实现200公里外的站点
国内顺畅下载k8s.gcr.io的镜像
自动化测试appium
ctfshow ssrf
Linux操作系统学习之实用指令(Centos7/8均
上一篇文章      下一篇文章      查看所有文章
加:2022-03-10 23:03:00  更:2022-03-10 23:03:19 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/16 3:50:25-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码