Linux之Shell编程

shell是什么

shell是一个命令行解释器,他为用户提供一个向linux内核发送请求以便运行程序的界面系统级程序,用户可以用shell来启动,挂起,停止甚至编写一些程序。
image.png


shell脚本的执行方式

脚本格式要求

  1. 脚本以#!/bin/bash开头
  2. 脚本需要有执行权限

编写第一个shell脚本

vim hello.sh
#!/bin/bash
echo "hello,shell"

执行脚本

  1. hello.sh赋予执行权限
  2. 使用相对路径执行脚本./hello.sh,或者使用绝对路径执行脚本./home/shcode/hello.sh,或者使用sh hello.sh也可以使用绝对路径。

image.png


shell变量

linux shell中的变量可以分为系统变量和用户自定义变量
系统变量:$HOME, $PWD, $SHELL, $USER等等,比如 echo $SHELL
显示当前shell中的所有变量:setimage.png

shell变量的定义

语法
  1. 定义变量:变量名=值
  2. 撤销变量:unset 变量
  3. 声明静态变量:readonly 变量

静态变量无法unset

#!/bin/bash
# 定义变量A
A=100
#输出变量需要使用$
echo A=$A
echo "A=$A"
# 撤销变量A
unset A
echo "A=$A"
# 声明静态变量B=2,不能unset
readonly B=2
echo "B=$B"
#unset B
# 将指令的结果赋给变量,使用``或者$()
C=`date`
D=$(date)
echo "C=$C"
echo "D=$D"
# 使用环境变量 SHELL
echo "shell=$SHELL"

image.png
vim中多行注解

:<<!
xxx
...
!

定义变量的规范
  1. 变量名称可以由字母,数字和下划线组成,但是不能以数字开头。
  2. 等号两侧不能由空格
  3. 变量名一般习惯大写

设置环境变量

  1. vim /etc/profile
  2. export 变量名=变量值 (将shell变量输出为环境变量/全局变量)
  3. source 配置文件 (让修改后的配置信息生效)
  4. echo $变量名

image.png
在/etc/profile文件中定义TOMCAT_HOME环境变量
image.png
image.png


位置参数变量

当我们执行一个shell脚本时,如果希望获取到命令行的参数信息,就可以使用到位置参数变量。例如./myshell.sh 100 200这个就是一个执行shell的命令行,可以在myshell脚本中获取到参数消息(100和200)。

语法
  1. $n:n为数字,$0表示命令本身,$1- 9 表示第一到第九个参数,十以上的参数需要使用大括号包含, 9表示第一到第九个参数,十以上的参数需要使用大括号包含, 9表示第一到第九个参数,十以上的参数需要使用大括号包含,{10}
  2. $*:代表命令行中所有参数,把所有的参数看成一个整体
  3. @ :也代表命令行中所有参数,不过 @:也代表命令行中所有参数,不过 @:也代表命令行中所有参数,不过@把每个参数区分对待
  4. $#:代表命令行中所有参数的个数
#!/bin/bash
echo "0=$0, 1=$1,2=$2"
echo "所有的参数=$*"
echo "$@"
echo "参数个数=$#"

image.png


预定义变量

就是shell设计者事先已经定义好的变量,可以直接在shell脚本中使用。

语法
  1. $$:表示当前进程的进程号
  2. $!:后台运行的最后一个进程的进程号
  3. $?:最后一次执行的命令的返回状态,如果这个变量的值为0,证明上一个命令正确执行;如果这个变量的值非0,则证明上一个命令执行不正确。
#!/bin/bash
echo "当前进程的进程号id=$$"
# 以后台的方式运行一个脚本,并获取他的进程号
/home/shcode/hello.sh &
echo "最后一个后台方式运行的进程id=$!"
echo "执行的结果是=$?"

运算符

语法

  1. $((运算式)) 或 $[运算式] 或 expr m + n
  2. 注意expr运算符间要有空格,如果希望将expr结果赋给某个变量,使用``
  3. expr m - n
  4. expr *, /, % (乘,除,求余)

案例

#!/bin/bash
# 案例1:计算(2+3)* 4
# 使用第一种方式
RES1=$(((2 + 3)*4))
echo "res1=$RES1"
# 使用方式2,推荐使用
RES2=$[(2+3)*4]
echo "res2=$RES2"
# 使用方式3 expr
TEMP=`expr 2 + 3 `
RES4=`expr $TEMP \* 4`
echo "temp=$TEMP"
echo "res4=$RES4"
# 案例2:求命令行的两个参数的和 20 50
SUM=$[$1+$2]
echo "sum=$SUM"

image.png


流程控制

判断语句

语法

[ condition ]

注意condition前后要有空格,非空返回true, 可以使用$?验证(0为true,>1 为fasle)

判断语句:

  • = 字符串比较
  • 整数比较
    • -lt 小于
    • -le 小于等于 little equal
    • -eq 等于
    • -gt 大于
    • -ge 大于等于
    • -ne 不等于
  • 按照文件权限比较
    • -r 有读权限
    • -w 有写权限
    • -x 有执行权限
  • 按文件类型比较
    • -f 文件存在且是常规文件
    • -e 文件存储
    • -d 文件存在且是目录
案例
#!/bin/bash
# 案例1:字符串是否相等
if [ "ok" = "ok" ]
then
        echo "equal"
fi
# 案例2:23是否大于等于22
if [ 23 -gt 22 ]
then
        echo "大于"
fi
# 案例3:/home/shcode/oper.sh 文件是否存在
if [ -f /home/shcode/oper.sh ]
then
        echo "存在"
fi
#案例4:条件不为空
if [ root ]
then
        echo "root"
fi

image.png


if判断

语法
if [ condition ]
then
	语句块
fi
# 或,多分支
if [ condition ]
then
	语句块
elif [ condition ]
then
	语句块
fi

案例
#!/bin/bash
# 如果输入的参数大于等于60输出“及格了”否则输出“不及格”
if [ $1 -ge 60 ]
then
        echo "及格了"
elif [ $1 -lt 60 ]
then
        echo "不及格"
fi

image.png


case语句

语法
case $变量名 in
"值1")
语句块
;;
"值2")
语句块
;;
*)
如果变量的值都不是以上的值,则执行此程序
;;
esac

案例
#!/bin/bash
# 当命令行参数为1,输出周一,是2输出周二,其他情况输出other
case $1 in
"1")
echo "周一"
;;
"2")
echo "周二"
;;
*)
echo "other"
;;
esac

image.png


for循环

语法
for (( 初始值; 循环控制条件; 变量变化))
do
	代码
done

案例
#!/bin/bash
# 打印命令行输入的参数
# $*是把输入的参数,当做一个整体,所以只会输出一句
for i in "$*"
do
        echo "num is $i"
done
# $@获取输入的参数,是分开处理的
for j in "$@"
do
        echo "num is $j"
done

image.png

#!/bin/bash
SUM=0
for(( i=1; i<=$1; i++))
do
        SUM=$[$SUM+$i]
done
echo "SUM=$SUM"

image.png


while循环

语法
while [ condition ]
do
代码块
done

案例
#!/bin/bash
# 求1到n的值
SUM=0
i=0
while [ $i -le $1 ]
do
        SUM=$[$SUM+$i]
        i=$[$i+1]
done
echo "SUM=$SUM"

image.png


read读取控制台输入

语法

read (选项)(参数)

选项:

  • -p:指定读取值时的提示符
  • -t:指定读取值时等待的时间(秒),如果没有在指定的时间内输入,就不再等待。

参数:

  • 指定读取值的变量名

案例

#!/bin/bash
# 案例1:读取控制台输入的num1
read -p "请输入一个数NUM1=" NUM1
echo "你输入的NUM1="$NUM1
# 案例2:读取控制台输入的NUM2值,在10s内输入
read -t 10 -p "请输入一个数NUM2=" NUM2
echo "你输入的NUM2="$NUM2

image.png


函数

shell中既有系统函数也有自定义函数

系统函数

语法
basename [pathname] [suffix]

功能:返回完整路径最后/的部分,常用于获取文件名
image.png


dirname 文件绝对路径

image.png

自定义函数

语法
function functionName() {
  	Action;
    [return int;]
}

案例
#!/bin/bash
# 案例1:计算输入两个参数的和
function getSum() {
        SUM=$[$n1+$n2]
        echo "和是=$SUM"
}
# 输入两个值
read -p "请输入一个数n1=" n1

read -p "请输入一个数n2=" n2
# 调用自定义函数
getSum $n1 $n2

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

JavaScript基础(24)_dom查询练习(一)

<!DOCTYPE html> <html lang"zh"> <head><meta charset"UTF-8"><link rel"stylesheet" href"../browser_default_style/reset.css"><title>dom查询练习一</title><style>.text {widt…

JS手写apply,call,bind函数

本篇文章咱们来手写简易版的apply&#xff0c;call&#xff0c;bind函数。 实现思路 首先咱们需要思考下这三个函数放到哪里比较合适&#xff0c;因为这三个函数是被函数对象调用的&#xff0c;并且每个函数都可以调用&#xff0c;所以不难想到有一个位置非常合适&#xff0c;…

解决Docker报错问题:Docker Desktop – Unexpected WSL error

最近因为准备在NAS上通过Docker容器方式安装MYSQL&#xff0c;发现https://hub.docker.com网站被墙了&#xff0c;无法自动安装&#xff0c;同时又找不到靠谱的离线镜像&#xff0c;所以准备在Window上安装Docker&#xff0c;通过电脑的网络代理制作离线镜像再上传到NAS上。 在…

媒体捕捉-iOS自定义二维码扫描功能

引言 随着iOS 7引入AV Foundation框架&#xff0c;二维码扫描功能已经成为iOS应用程序中不可或缺的一部分。现今&#xff0c;几乎每个应用都充分利用这一功能&#xff0c;为用户提供了诸如扫码登录、扫码填充等丰富多彩的便捷体验。这项技术不仅丰富了应用功能&#xff0c;也为…

校园-智慧门禁(卡码脸)解决方案

前言 入职新公司也已经一年有余&#xff0c;入职后主要从事的是门禁项目&#xff0c;公司设计的项目是偏saas化的智慧门禁系统&#xff0c;目前已经在多所大学上线&#xff0c;以下是对该项目的个人总结复盘。 一、系统主要功能和扩展功能 可实现学校统一门禁设备管理可实现人…

第14届蓝桥杯省赛scratch真题+解题思路+详细解析

一、选择题 一共有5道选择题&#xff0c;每题10分&#xff0c;共50分&#xff0c;严禁使用程序验证&#xff0c;选择题不答和答错不得分。 1. 运行以下程序&#xff0c;舞台上能看到几只小猫&#xff1f;&#xff08; &#xff09; A. 4 B. 5 C. 6 D. 7 答案&#xff…

软件测试|Linux三剑客之grep命令详解

简介 grep是一款在 Linux 和类 Unix 系统中广泛使用的文本搜索工具。它的名字来源于 Global Regular Expression Print&#xff08;全局正则表达式打印&#xff09;&#xff0c;它的主要功能是根据指定的模式&#xff08;正则表达式&#xff09;在文本文件中搜索并打印匹配的行…

reiserfs文件系统的磁盘布局

reiserfs文件系统的磁盘布局比较简单&#xff0c;它把整块分区分成相同大小的block块&#xff0c;一个block块的大小默认是4K&#xff0c;而最大块数未2^32次方&#xff0c;即一个分区最大大小为16TB。 reiserfs文件系统分区的前64KB总是为分区标签&#xff08;partition labe…

推荐收藏!万字长文带入快速使用 keras

这些年&#xff0c;有很多感悟&#xff1a;一个人精力是有限的&#xff0c;一个人视野也有有限的&#xff0c;你总会不经意间发现优秀人的就在身边。 看我文章的小伙伴应该经常听我说过的一句话&#xff1a;技术要学会交流、分享&#xff0c;不建议闭门造车。一个人可以走的很…

CSS基础笔记-03选择器

CSS基础笔记系列 《CSS基础笔记-01CSS概述》《CSS基础笔记-02动画》 前言 在前面两篇博客中&#xff0c;我实际上已经使用过了选择器。但到底什么是选择器、有什么作用&#xff0c;我反而不能表达出来。因此&#xff0c;决定记录了我的学习和思考。 什么是选择器 selector…

基于 HTTPS 协议配置 Git 连接 GitHub

文章目录 0.安装 Git1.注册 GitHub 账号2.配置 Git 的用户名和邮箱3.远程连接 GitHub 有两种传输协议4.基于 SSH 协议配置 Git 连接 GitHub5.基于 HTTPS 协议配置 Git 连接 GitHub5.1 创建 GitHub 个人访问令牌5.2 有两种方法将本地仓库和远程仓库关联起来5.2.1 第一种方法&…

【大数据】基于 Flink CDC 构建 MySQL 和 Postgres 的 Streaming ETL

基于 Flink CDC 构建 MySQL 和 Postgres 的 Streaming ETL 1.准备阶段1.1 准备教程所需要的组件1.2 下载 Flink 和所需要的依赖包1.3 准备数据1.3.1 在 MySQL 数据库中准备数据1.3.2 在 Postgres 数据库中准备数据 2.启动 Flink 集群和 Flink SQL CLI3.在 Flink SQL CLI 中使用…

x-cmd pkg | norwegianblue - 软件生命周期查询工具

目录 简介首次用户功能特点进一步探索 简介 norwegianblue 由 Hugo van Kemenade 使用 Python 开发&#xff0c;于 2021 年推出。用于显示多种产品的生命周期终止&#xff08;EOL&#xff09;日期的 CLI 工具。基于 endoflife.date 网站的接口&#xff0c;提供有关各种产品的最…

new和delete表达式的工作步骤

new表达式工作步骤 调用一个operator new库函数开辟未类型化的空间 void *operator new(size_t); 在为类型化的空间上调用构造函数&#xff0c;初始化对象的成员 返回相应类型的指针 delete表达式工作步骤 调用相应类型的析构函数,但析构函数并不能删除对象所在的空间&…

处cp社交类微信小程序前端开源(二)

在上一篇文章介绍如何用SpringBoot整合websocket实现在线聊天&#xff0c;这篇文章介绍如何将uniapp社交类前端源码打包部署微信小程序&#xff0c;和如何上线微信小程序&#xff0c;上线需要的资料&#xff0c;并且介绍我是如何获取用户&#xff0c;如何变现&#xff0c;现在的…

nginx下upstream模块详解

目录 一&#xff1a;介绍 二&#xff1a;特性介绍 一&#xff1a;介绍 Nginx的upstream模块用于定义后端服务器组&#xff0c;以及与这些服务器进行通信的方式。它是Nginx负载均衡功能的核心部分&#xff0c;允许将请求转发到多个后端服务器&#xff0c;并平衡负载。 在upst…

前端-基础 常用标签-超链接标签( 锚点链接 )

锚点链接 &#xff1a; 点击链接&#xff0c;可以快速定位到 页面中的某个位置 如果不好理解&#xff0c;讲一个例子&#xff0c;您就马上明白了 >>> 这个是 刘德华的百度百科 &#xff0c;可以看到&#xff0c;页面里面有很多内容&#xff0c;那就得有个目录了 …

RabbitMQ高级

文章目录 一.消息可靠性1.生产者消息确认2.消息持久化3.消费者确认4.消费者失败重试 MQ的一些常见问题 1.消息可靠性问题:如何确保发送的消息至少被消费一次 2.延迟消息问题:如何实现消息的延迟投递 3.高可用问题:如何避免单点的MQ故障而导致的不可用问题 4.消息堆积问题:如…

狂肝100小时,各大厂20W字面试真题分享

有很多童靴问我&#xff0c;有没有大厂的面试集合&#xff0c;可以针对性备考一下&#xff0c;我说面试题网络上有很多&#xff0c;随便搜索一下&#xff0c;就一大把吧。他们回复说&#xff0c;都是针对各个知识点的题目&#xff0c;想要吃透&#xff0c;至少要1-3个月的时间&…

NCC基础开发技能培训

YonBuilder for NCC 是一个带插件的eclipse工具&#xff0c;跟eclipse没什么区别 NC Cloud2021.11版本开发环境搭建改动 https://nccdev.yonyou.com/article/detail/495 不管是NC Cloud 新手还是老NC开发&#xff0c;在开发NC Cloud时开发环境搭建必看&#xff01;&#xff…