【Linux系统 02】Shell脚本

目录

一、Shell概述

二、输入输出

三、分支控制

1. 表达式

2. if 分支

3. case 分支

四、循环控制

1. for 循环

2. while 循环

3. select 循环

五、函数


一、Shell概述

Shell是Linux系统连接用户和操作系统的外壳程序,将用户的输入和请求选择性传递给操作系统,然后处理来自操作系统的结果输出,简单来说Shell就是一个用户和操作系统之间的命令解释器。

Shell是一个外壳程序,同时也是一个脚本语言。

Shell脚本本质上是Linux命令,一条一条命令组合在一起,实现某一个功能,就形成了Shell脚本。

最常用的Shell是Bash(/bin/bash),是大多数Linux系统默认的Shell环境。

shell编程注意事项

  • shell文件通常以后缀 .sh 结尾;
  • 不能使用特殊符号,有严格的空格控制;
  • shell文件以 #!/bin/bash 开头
  • shell脚本变量命名规则与C语言一样

二、输入输出

Shell脚本语言只有一种数据类型,就是字符类型,即所有变量的类型都是字符,输入和输出的都是字符。

Shell变量分为用户变量环境变量系统变量,环境变量分为用户级、系统级和脚本级,用户级变量重启Shell外壳就会自动清除,系统变量用于实现某一个功能而存在。

变量的可用 = 进行赋值创建,用 $ 获取变量值,用 unset 清除变量。

# Shell常见的环境变量:PATH  		命令所示路径,以冒号为分割;
HOME  		打印用户家目录;
SHELL 		显示当前Shell类型;
USER  		打印当前用户名;
ID    		打印当前用户id信息;
PWD   		显示当前所在路径;
TERM  		打印当前终端类型;
HOSTNAME    显示当前主机名;
PS1         定义主机命令提示符的;
HISTSIZE    历史命令大小,可通过 HISTTIMEFORMAT 变量设置命令执行时间;
RANDOM      随机生成一个 0 至 32767 的整数;
HOSTNAME    主机名
# Shell常见的系统变量:$0 		当前脚本的名称;
$n 		当前脚本的第n个参数,n=1,2,…9;
$* 		当前脚本的所有参数(不包括程序本身);
$# 		当前脚本的参数个数(不包括程序本身);
$? 		令或程序执行完后的状态,返回0表示执行成功;
$$ 		程序本身的PID号。

变量也可通过 read 进行键盘输入赋值,通过 echo 输出。

在使用 read 输入数据时,可配合 echo 使用进行输出提示,如 echo 提示字符串; read 变量 ,也可直接使用 read -p 提示字符串 变量 进行输入提示

在用 $ 对变量取值时,为了其他字符串对变量的影响,可用 { } 跟在 $ 后面将变量括起来。

#!/bin/bash# 颜色输出格式 echo -e "\033[(显示方式);(字体色);(背景色)m(输入内容)\033[0m"
testStr1="hello world!\n"
echo $testStr1# 显示方式:
# 1 粗体高亮
# 4 下划线
# 5 闪烁
# 8 隐藏# 字体颜色:
# 31 红色
# 32 绿色
# 33 黄色
# 34 蓝色
# 35 紫色
# 36 天蓝
# 37 白色# 背景颜色:
# 41 红色
# 42 绿色
# 43 黄色
# 44 蓝色
# 45 紫色
# 46 天蓝
# 47 白色echo "请输入一个测试字符串:"; read testStr2
echo -e "\033[1;31;46m$testStr2\033[0m"
# 最后的0表示恢复默认系统输出默认设置# echo 加上 -e 选项之后支持转移字符:
# \n 回车换行
# \r 回车
# \v 换行
# \t Tab制表符距离
# \c 在字符串输入末尾不换行echo -e "请输入一个测试字符串:\c"; read testStr3
echo -e "\033[4;33;42m$testStr3\033[0m"#echo 加上 -n 选项,输出不换行
read -p "请输入一个测试字符串:" testStr4
echo -e -n "\033[5;35;41m${testStr4}\033[0m"

三、分支控制

1. 表达式

Shell脚本中的表达式分为算术表达式逻辑表达式,算术表达式常用 let 进行赋值和计算,也可以用 ((表达式)) 双小括号进行算术表达式的赋值和计算。

除了Shell自身的算术表达式处理方式,还可以通过下载 bc 工具进行处理,也可用通过Shell脚本将字符串通过管道 | 传递给bc工具,让bc工具进行计算

逻辑表达式常用 test 命令进行逻辑判断,test命令的退出码为0表示逻辑为true,否则为false,通常在test命令的后面跟上 echo $? 语句显示test命令的判断结果。

test命令在进行判断的时候,= 两边都需要空一格。

test命令可用 [ ] 中括号进行等价替换,注意 [] 前后中括号之间都要有空格。

#!/bin/bashecho "算术计算:"
a=1
b=2
let c=$a+$b
echo $c((d=($a+$b)*$c))
echo $d
echo $(($c/$b))yum install -y bc
echo "$c/$b" | bc
echo "scale=2;$c/$b" | bc
# bc工具通过scale指定精度echo "逻辑判断:"
test $a = $b; echo $?
test $c = $(($a+$b)); echo $?# 复合条件判断
# -gt 大于,greater than
# -lt 小于,less than
# -ge 大于等于,greater or equal
# -le 小于等于,less or equal
# -eq 数值等于,equal
# -a  与,可用&&替换,and
# -o  或,可用||替换,orecho "复合条件判断:"
age=15
test $age -gt 10 -a $age -lt 20; echo $?
test $age -lt 10 -o $age -gt 20; echo $?[ $age -gt 10 ] && [ $age -lt 20 ]; echo $?
[ $age -le 10 ] || [ $age -ge 20 ]; echo $?# 文件和目录属性判断:
# -e 判断文件或目录是否存在
# -f 判断是否为文件以及是否存在
# -d 判断是否为目录以及是否存在
# -r -w -x 判断权限chmod u-x _02_expression.sh
[ -r _02_expression.sh ]; echo $?
[ -w _02_expression.sh ]; echo $?
[ -x _02_expression.sh ]; echo $?
chmod u+x _02_expression.sh

2. if 分支

逻辑判断语句通常会搭配 if 条件分支控制语句使用,if条件控制语句有单分支、双分支和多分支三种不同的格式。

#!/bin/bash# 单分支格式
if [ -f _01_hello.sh ]; thenecho "01FILE EXIST!"
fi# 双分支格式
if [ -f _02_hello.sh ]; thenecho "02FILE EXIST!"
elseecho "02FILE NOT EXIST!"
fi# 多分支格式
if [ -d _01_hello.sh ]; thenecho "01DIR EXIST!"
elif [ -f _01_hello.sh ]; thenecho "01FILE EXIST!"
elseecho "01FILE 01DIR NOT EXITS"
fi# 判断crond进程是否正常运行
name=crond
num=$(ps -ef|grep $name|grep -vc grep)
if [ $num -eq 1 ];thenecho "$num running!"
elseecho "$num is not running!"
fi

3. case 分支

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

case值得注意的特点:

  • case行尾必须为单词"in",每一模式必须以右括号“)”结束
  • 双分号";;"表示命令序列结束
  • 模式字符串中,可以用方括号表示一个连续的范围,如"[0-9]";还可以用管道符号" | “表示或,如"A|B”
  • 最后的 " *) " 表示默认模式,其中的 星号 相当于通配符
#!/bin/bashread -p "请输入一个字符:" inputcase "$input" in
[a-z]|[A-Z])echo "您输入的是一个字母";;
[0-9])echo "您输入的是一个数字";;
*)echo "您输入的是一个空格、功能键或其他按键";;
esac

四、循环控制

1. for 循环

for val in valuelist...
docommands
donefor((exp1;exp2;exp3))
docommands
done
# exp1 初始化
# exp2 变量取值范围
# exp3 变量增量
#!/bin/bashfor i in {1..5};
doecho -e "\033[${i}mhello world\033[0m"
donefor i in 1 3 5;
dofor j in 31 33 35 37;doecho -e "\033[${i};${j}mhello world\033[0m"done
done

2. while 循环

while 条件判断
docommand...
done# while后面的命令执行成功则循环,否则跳出循环
#!/bin/bashcount=3
while [ $count -ge 0 ] 
doecho $countlet count=$count-1
donecount=3
while (($count >= 0))
doecho $count((count--))
done# 通过while实现shell脚本给文件内容添加行号
if [ -f $1 ]; theni=1cat $1 | while read textdoecho "$i:$text"((i++))done
elseecho "文件不存在"
fi

3. select 循环

select var in menu...
docommands
done# select 后面跟的是菜单
# in 关键字后面是菜单取值列表
# 这些值以空格隔开
# 用户选择数字对应菜单值
# 变量var获取值后执行循环一次
#!/bin/bashPS3="Please Select[1-4]"select m in one two three four exit;
doif [ $m = exit ]; thenbreakfiecho $m
done# PS3是一个环境变量,是select的提示符

五、函数

Shell的函数定义与C语言类似,需要先定义再调用原则,函数名后面接小括号,可以有参数或返回值,但是没有返回值类型。

#shell中的函数定义
#其中function为关键字,FUNCTION_NAME为函数名
function FUNCTION_NAME(){command1 #函数体中可以有多个语句,不允许有空语句command2...
}
#省略关键字function,效果一致
FUNCTION_NAME(){command1command2...
}# 函数名后的小括号中没有参数
# 函数function关键字可以不写
# 函数必须遵循先定义再调用原则
#!/bin/bashecho -n "请输入文件名:"
read FILE
function checkFileExist(){if [ -f $FILE ]; thenreturn 0elsereturn 1fi
}echo "call function checkFileExist"
checkFileExist
if [ $? -eq 0 ]; thenecho "$FILE exist"
elseecho "$FILE not exist"
fi
#!/bin/bashHello(){echo "hello world"
}Hello# 写一个函数判断文件是否存在 
function CheckFileExist(){if [ -f $1 ]; thenreturn 0elsereturn 1fi
}read -p "请输入文件名:" filename
CheckFileExist $filenameif [ $? -eq 0 ]; thenecho "$filename is exits!"
elseecho "$filename is not exits!"
fi

由于Shell是一门面向过程的脚本型语言,而且用户主要是Linux系统管理人员,所以并没有非常活跃的社区,这也造成了Shell缺乏第三方函数库,所以在很多时候需要系统管理人员根据实际工作的需要自行开发函数库。下面建立一个叫 funclib 的函数库,该函数库目前只有一个函数,用于判断文件是否存在。

_checkFileExists(){if [ -f $1 ]; thenecho "File:$1 exists"elseecho "File:$1 not exist"fi
}

其他脚本在希望直接调用_checkFileExists函数时,可以通过直接加载 funclib 函数库的方式实现。加载方式有如下两种:

#使用“点”命令
$ . /PATH/TO/LIB#使用source命令
$ source /PATH/TO/LIB

假设现在有个脚本想要直接调用_checkFileExists函数,可以通过加载 funclib 函数库来实现。

可以通过 set unset 命令查看当前内存中已经定义和载入的函数,使用 unset 清除函数,函数修改后必须重新载入。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/666636.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java中Object类常用的12个方法

前言 Java 中的 Object 方法在面试中是一个非常高频的点,毕竟 Object 是所有类的“老祖宗”。Java 中所有的类都有一个共同的祖先 Object 类,子类都会继承所有 Object 类中的 public 方法。 先看下 Object 的类结构: 1. getClass 方法 pub…

「悬浮捷径SoftCircle」安卓平台的hao123,一键打开万物

罗老师的onestep一步发布之前, 终端的打开形式还拘泥于桌面和负一屏 这种方式够简洁,但缺点明显: 1.入口单一性:只能在app首页和各种扫一扫之间选择和切换 2.操作复杂:入口切换需要频繁的进入退出桌面,步骤过于繁杂 以下是悬浮捷径SoftCircle的解决方式 1.入口的丰富性: 安卓平…

如何在飞凌嵌入式T113-i开发板的Buildroot中移植MQTT协议?

在实际的项目开发中,工程师朋友们可能会需要在文件系统中移植一些工具或协议,那么该如何进行移植操作呢? 我们可以通过添加package包配置的方式在OK113i-S开发板的Buildroot中移植新功能。本篇文章,小编就以在Buildroot移植MQTT协…

关于Django部署

首先了解一下开发环境服务器跟生产环境服务器有何不同。 一、我们通过 python manage.py runserver 启动开发环境服务器,这条命令背后做了哪些事情? 1、首先加载Django项目的设置(settings) 2、检查数据库迁移,确保数…

Leetcode92:反转链表II(区间反转链表)

一、题目 给你单链表的头指针 head 和两个整数 left 和 right &#xff0c;其中 left < right 。请你反转从位置 left 到位置 right 的链表节点&#xff0c;返回 反转后的链表 。 示例&#xff1a; 输入&#xff1a;head [1,2,3,4,5], left 2, right 4 输出&#xff1a…

Multisim14.0仿真(五十一)基于LM555定时器的分频器设计

一、1KHz脉冲设置&#xff1a; 二、555脉冲电路&#xff1a; 三、仿真电路&#xff1a; 四、运行仿真&#xff1a;

Day 1. 学习linux高级编程之Shell命令和IO

1.C语言基础 现阶段学习安排 2.IO编程 多任务编程&#xff08;进程、线程&#xff09; 网络编程 数据库编程 3.数据结构 linux软件编程 1.linux&#xff1a; 操作系统&#xff1a;linux其实是操作系统的内核 系统调用&#xff1a;linux内核的函数接口 操作流程&#xff…

Unity类银河恶魔城学习记录1-10 PlayerWallJump源代码 P37

Alex教程每一P的教程原代码加上我自己的理解初步理解写的注释&#xff0c;可供学习Alex教程的人参考 【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili Player.cs using System.Collections; using System.Collections.Generic; using Unity.VisualScripting; u…

海外YouTube视频点赞刷单悬赏任务投资理财源码/tiktok国际版刷单理财

测试环境&#xff1a;Linux系统CentOS7.6、宝塔、PHP7.3、MySQL5.7&#xff0c;根目录public&#xff0c;伪静态Laravel5&#xff0c;开启SSL证书 前端&#xff1a;修改网站的默认文档 index.html 为第一个&#xff0c; index.php 改成第二个 &#xff0c;或者前端访问 index.…

OJ_整数奇偶排序

题干 c实现 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<algorithm> using namespace std;//compare函数不交换返回true bool compare(int a, int b) {//1.a奇数&#xff0c;b偶数&#xff0c;不交换//2.a奇数&#xff0c;b奇数&#xff0c;a比b…

C语言实现跳表(附源码)

最近在刷一些链表的题目&#xff0c;在leetcode上有一道设计跳表的题目&#xff0c;也是通过查阅各种资料&#xff0c;自己实现出来&#xff0c;感觉这是种很神奇的数据结构。 一.简介 跳表与红黑树&#xff0c;AVL树等&#xff0c;都是一种有序集合&#xff0c;那既然是有序…

Prompt Engneering(提示词工程)

大模型的目标是理解和生成人类语言。给定一些词语&#xff0c;语言模型可以预测下一个词语可能是什么&#xff0c;或者给定的一些词语生层对应内容。 那么如何引导它们产生期望的输出&#xff0c;或者说如何提问&#xff0c;就成为了一个关键的问题。这就引入了一个重要的概念…

QStandardItemModel与QTableView里如何设置复选框居中

笔者为这个问题思索了不少时间&#xff0c;这个问题就是c qt里创建了一个QStandardItemModel设置了表格的表头&#xff0c;往表格填充数据时&#xff0c;数据的复选框左对齐&#xff0c;想要设置复选框居中对齐&#xff0c;不知道如何处理&#xff0c;这里给出代码与运行效果&a…

用Python画一条祥龙,祝您新年龙腾万里

用Python画一条祥龙&#xff0c;祝您新年龙腾万里 龙年到了&#xff0c;祝大家新年龙行龘龘&#xff0c;龙腾万里&#xff01; 从2021年开始&#xff0c;我每年都用Python画一幅当年生肖的图。 用Python标准库turtle画一头金牛&#xff0c;祝您新年牛气冲天&#xff01; 用P…

vscode 括号 python函数括号补全

解决方法 在setting.json中添加 “python.analysis.completeFunctionParens”: true 打开设置&#xff1b; 点击图中按钮打开setting.json文件 添加 “python.analysis.completeFunctionParens”: true

apipost 简单的性能压测总结

1、简单的使用机型牌评估 1&#xff09;jdk默认256M给100用&#xff0c;推荐给1000人同时用JVM 堆栈建议2G~4G&#xff08;目前定了机型4核8G内存 2T磁盘做radio0存储&#xff09;&#xff1b; 2&#xff09;数据库配置文件写了占了2G内存&#xff08;my.cnf文件&#xff09…

Python算法100例-1.3 牛顿迭代法求方程根

完整源代码项目地址&#xff0c;关注博主私信’源代码’后可获取 1&#xff0e;问题描述 编写用牛顿迭代法求方程根的函数。方程为 a x 3 b x 2 c x d 0 ax^3bx^2cxd0 ax3bx2cxd0&#xff0c;系数a、b、c、d由主函数输入&#xff0c;求x在1附近的一个实根。求出根后&…

详解SkyWalking前端监控的性能指标

SkyWalking 从8.2.0版本开始支持对前端浏览器端的性能进行监控&#xff0c;不仅可以像以前一样监控浏览器发送给后端服务的与请求&#xff0c;还能看到前端的渲染速度、错误日志等信息——这些信息是获取最终用户体验的最有效指标。实现的方式是引入skywalking-client-js库&…

STL篇三:list

文章目录 前言1.list的介绍和使用1.1 list的介绍1.2 list的使用1.3 list的迭代器的失效 2.list的模拟实现2.1 结点的封装2.2 迭代器的封装2.2.1 正向迭代器2.2.2 反向迭代器 2.3 list功能的实现2.3.1 迭代器的实例化及begin()、end() 2.3.2 构造函数2.3.3 赋值运算符重载2.3.4 …

YGG 为 Axie Infinity: Origins 发布超级任务游戏内训练器,深化对 Ronin 的支持

自 2023 年以来&#xff0c;Ronin 已成为增长最快的游戏区块链。由于 Axie Infinity 和 Pixels 等游戏的持续成功&#xff0c;日活跃用户数量至少增长了 10 倍。在过去的一年里&#xff0c;有超过 120 万个新地址加入&#xff0c;并且&#xff0c;这个数字还在持续增长。 ​Ron…