【Linux】Shell编程

Shell编程

目录

  • Shell编程
    • 1.shell基础
      • 1.输入重定向 & 输出重定向
      • 2.管道
      • 3.特殊字符
        • (3.1)通配符
        • (3.2)引号
        • (3.3)注释符(#)
      • 4.别名
      • 5.命令历史`history`
    • 2.Shell脚本
      • Shell脚本的执行方式
        • (1)为脚本文件加上可执行权限,然后在命令行直接输入shell脚本文件名执行。
        • (2)sh shell脚本名
        • (3). shell脚本名
    • 3.shell变量
      • 1.用户自定义变量
        • (1.1)定义
        • (1.2)清除变量
      • 2. 环境变量
        • (2.1)常用环境变量
        • (2.2)查看环境变量
      • 3. 位置变量
      • 4.特殊变量
    • 4.shell编程基础
      • 1.shell脚本的输入/输出
        • (4.1)输入命令
        • (4.2)输出命令
        • (4.3)export命令
          • export的语法:
      • 2.shell的逻辑运算
        • (2.1)条件测试
        • (2.2)逻辑运算
      • 3.shell的算术运算
      • (1)使用expr命令
      • (2)使用shell扩展$((expression))
      • (3) let命令
    • 5.shell的控制结构
      • 1.if语句
      • 2.elif语句
      • 3.case语句
      • 4.for语句
      • 5.while语句 & until语句
      • 6.break和continue语句
        • (1) break命令
        • (2) continue命令
    • 6.shell函数
      • 1.函数定义
      • 2 函数调用
      • 3.带参数的shell函数如何实现
  • 参考

1.shell基础

1.输入重定向 & 输出重定向

输入重定向 : command [参数] < 文件名
输出重定向 : command [参数] > 文件名

输出重定向追加 : command [参数] >> 文件名
在源文件的内容后面追加

2.管道

Shell使用管道将一个命令的输出直接作为另一个命令的输入
通过使用管道符 ‘|’ 来建立一个管道:
command_a [参数] | command_b [参数]

3.特殊字符

(3.1)通配符

通配符用于模式匹配,如文件名匹配、路径名搜索、字符串查找等。

  • *代表任何字符串(包括0个)
  • ?代表任何单个字符
  • [] 代表指定的一个字符范围,只要文件名中 [] 位置处打字符在 [] 中指定的范围之内,那么这个文件名就与这个模式串匹配。
(3.2)引号
  • 单引号('): 由单引号括起来的字符都作为普通字符出现。特殊字符用单引号括起来以后也会失去原有意义,而只作为普通字符解释。
  • 双引号("): 由双引号括起来的字符,除“$”、“\”、“’”、和“””这几个字符仍是特殊字符并保留其特殊功能外,其余字符作为普通字符对待。
  • 反引号(`): 反引号(`)括起来的字符串被shell解释为命令,在执行时,shell首先执行该命令,并以它的标准输出结果取代整个反引号(包括两个反引号)部分。
string = "current directory is `pwd`"
(3.3)注释符(#)

4.别名

(4.1)命令别名通常是其他命令缩写,用来减少键盘输入。命令格式为:
alias new-name = 'original-command'

(4.2)取消别名:
unalias new-name

(4.3)不加参数的alias命令执行结果将显示当前系统中定义的所有命令别名

5.命令历史history

(5.1)通过history命令可以对当前系统中执行过的所有shell命令进行显示

(5.2)若想重复执行命令历史中指定的命令,可使用如下格式:

!命令编号

(5.3)环境变量HISTSIZE的值保存历史命令记录的总行数,该值的范围正常情况下是100~1000,当从shell中退出时,最近执行的命令将保存在HISTFILE变量指定的文件中。

HISTSIZE和HISTFILESIZE的区别:

  • HISTFILESIZE: 定义了在 .bash_history 中保存命令的记录总数.
  • HISTSIZE: 定义了 history 命令输出的记录数.

2.Shell脚本

Shell脚本是用shell命令编写的文件,也称为shell script。与结构化程序不同,shell不需要编译成目标程序,也不需要链接成可执行的目标码,shell是按行一条接着一条地解释并执行shell脚本中的命令。

Shell脚本的执行方式

  • (1)为脚本文件加上可执行权限,然后在命令行直接输入shell脚本文件名执行。
chomd u+x file_name
./filename
  • (2)sh shell脚本名
sh filename
  • (3). shell脚本名
. filename

3.shell变量

在shell脚本中也可以使用变量,一个变量就是内存中被命名的一块存储空间。

  • 一个Shell变量的名字可以包含数字,字母和下划线,变量名的开头只准许是字母和下划线。变量名中的字母是大小
    写敏感的
  • 变量名在理论上的长度没有限制。
  • 在shell编程中可以使用四种变量:用户自定义变量、环境变量、位置变量和特殊变量。

1.用户自定义变量

(1.1)定义

注意:如果字符串里包含空格,就必须用引号把它们括起来。还要注意在等号两边不能有空格。
无论何时想要获取变量内容,必须在它前面加$字符。

var_name=hello
echo $var_name
(1.2)清除变量

设置的变量不需要时可以清除,清除变量格式如下:

unset variable-name

2. 环境变量

  • 当一个shell脚本程序开始执行时,一些变量会根据环境设置中的值进行初始化,这就是环境变量
  • 它决定了用户的工作环境,通常用大写字母作为变量名,以便把它们和用户在脚本程序里定义的变量区分开来。
  • 环境变量的值在系统的配置文件中设置,用户可对其进行修改
(2.1)常用环境变量

在这里插入图片描述

(2.2)查看环境变量
env

3. 位置变量

如果脚本程序在执行时带有参数,就会创建一些额外的变量,这些额外的变量因跟变量所在命令行位置有关,因此被称为位置变量或位置参数。

  • shell提供的位置变量有$0、​$1、​$2、$3、$4、$5、$6、$7、$8、
    $9。

  • 这10个位置变量在shell脚本执行时用于存放shell脚本名及参数。
    其中位置变量**$0存放脚本名**,$1、$2、$3、$4、$5、$6、$7、$8、$9存放从左至右的命令行上的参数。

  • 当命令行上命令参数超过9个时,shell提供了shift命令可以把所有
    参数变量左移一个位置,使$2变成$1,$3变成$2,依此类推。

    • 使用格式如下:shift [n]
    • 其中n表示向左移动参数的个数,默认值为1。

4.特殊变量

shell中有一些变量是系统定义的,有特殊的含义,变量值由系统指定,被称之为特殊变量:

  • $#:表示传递给脚本的实际参数个数
  • $$:当前shell脚本的进程号
  • $*:位置参数的值,各个参数之间用环境变量IFS中定义的字
    符分隔开。
  • $@:也表示位置参数的值,它不使用IFS环境变量,所以当IFS为空时,参数值不会结合在一起。
  • $!:上一个后台命令的进程号。
  • $?:执行最后一条命令的退出状态。

4.shell编程基础

1.shell脚本的输入/输出

(4.1)输入命令
read var
输入的内容...
echo $var
输出 输入的内容
(4.2)输出命令
  • echo默认情况下是换行标准输出语句。
  • echo输出多个空格时必须用单引号括起
(4.3)export命令

export命令可将在shell脚本中定义的变量导出到子shell中,并使之在子shell中有效。

export命令用于将shell变量输出为环境变量,或者将shell函数输出为环境变量。

  • export命令可用于显示或设置环境变量。
  • export命令的效果仅限于当前登录终端。
export的语法:
export [-fnp] [变量名]=[变量设置值]

参数说明:

  • -f:代表[变量名称]中为函数名称。
  • -n:删除指定的变量;实际未删除,只是不会输出到后续指令的执行环境中。
  • -p:显示所有的shell赋予子程序的环境变量。

实例1:显示当前所有的环境变量

$ export -p

实例2:设置环境变量

$ export PATH=$PATH:/home/dabai/test/bin

2.shell的逻辑运算

所有程序设计语言的基础是对条件进行测试判断,并根据测试结果采取不同的操作

(2.1)条件测试

两种条件测试命令,语法格式如下:

  • test 条件表达式
  • [ 条件表达式 ]

注意:使用第二种方法进行条件测试时,必须在[ ]前后保留空格,否则shell提示error。

三种测试类型:

  • 字符串比较

在这里插入图片描述

  • 算术比较
    在这里插入图片描述

  • 文件条件测试
    在这里插入图片描述

(2.2)逻辑运算

在进行条件判断时,shell提供了复杂的逻辑运算,分别是:AND运算和OR运算

  • AND运算,运算符为$$,语法格式为:statement1 && statement2 && statement3
  • OR运算,OR允许持续执行一系列命令直到有一条命令成功为止,其后的命令将不再被执行。运算符为:||

3.shell的算术运算

bash提供了3种方法对数值数据进行算术运算:

  • (1)使用expr命令
  • (2)使用shell扩展$((expression))
  • (3)使用let命令

(1)使用expr命令

expr命令将它的参数当作一个表达式来求值。语法格式:

expr experssion

注意:在使用expr时,运算符前后要有空格,且乘法要用
“\”转义,即“*”的形式。

(2)使用shell扩展$((expression))

该命令用于计算一个expression并返回它的值。

a=2 b=3
echo "the result of a+b is $((a+b))"

(3) let命令

用来求算术表达式的值,如果最后表达式的值为0,let命令返回1;否则返回0。语法格式为:

let experssion

注意:使用let命令时,变量前的$不是必须的,乘法也
不需转义使用

5.shell的控制结构

1.if语句

if condition
then
	statements
else
	statements
fi
if condition ; then
	if condition ; then
		if condition ; then
			statements
		fi
	fi
fi
if condition1 ; then
	statements
elif condition2 ; then
	statements
elif condition3 ; then
	statements
	……
else
	statements
fi

2.elif语句

if condition1
then
	statements
elif condition2
then
	statements
elif condition3
then
	statements
	……
else
	statements
fi

3.case语句

case variable in
	pattern1) statements;;
	pattern2) statements;;
	……
	patternn) statements;;
	*) statements;;
esac

实例(根据数字输出星期几):

#!/bin/bash
echo "please enter the number of the week:"
read number
case $number in
1) echo "Monday";;
2) echo "Tuesday";;
3) echo "Wednsday";;
4) echo "Thursday";;
5) echo "Friday";;
6) echo "saturday";;
7) echo "Sunday";;
*) echo "your enter must be in 1-7.";;
esac
  • case支持合并匹配模式,即在每一个模式中,可以使用通配符逻辑符号
#!/bin/bash
echo " abc is the user's name? please answer yes or no"
read name
case "$name" in
y|Y|yes|YES) echo "hello abc!";;
n*|N*) echo "abc isn't the user's name?";;
*) echo "sorry,your input isn't recognized.";;
esac
exit 0
  • 在case结构中,每个分支模式可以执行多条命令
#!/bin/bash
echo " abc is the user's name? please answer yes or no"
read name
case "$name" in
 y|Y|yes|YES)
	echo "hello abc!"
	echo "yes!";;
 n*|N*)
	echo "abc isn't the user's name?"
	echo "no!";;
 *) 
	echo "sorry,your input isn't recognized."
	echo "please answer yes or no"
	exit 1
	;;
esac
exit 0

4.for语句

for variable in values
do
	statements
done

5.while语句 & until语句

while condition 
do
	statements
done

until语句与while语句一样,都是循环语句,但处理方式正好相反,即当判断条件为真时,循环停止:

until condition
do
	statements
done

6.break和continue语句

和C语言基本一致。

(1) break命令

break命令的功能是在控制条件未满足之前,跳出for、while或until循环。

(2) continue命令

使for、while或until循环跳到下一次循环继续执行,循环变量取循环列表中的下一个值。

6.shell函数

1.函数定义

语法格式:

function_name ( ) {
	statements
}

2 函数调用

通常将函数看成是脚本中的一段代码,在使用函数前必须先定义该函数,使用时利用函数名直接调用。调用也和编程语言类似。

3.带参数的shell函数如何实现

  • 1.在shell中,向函数传递参数是使用位置参数来实现的。
  • 2.指定位置参数的值除了在脚本运行时传入位置参数外,还可通过内置命令set命令给脚本指定位置参数,一旦使用set设置了传入参数的值,脚本将忽略运行时传入的位置参数,实际上是被set命令重置了位置参数的值。

使用 set 命令修改位置参数(即脚本参数 $1$2 等)。例如:

set -- arg1 arg2 arg3
或者
set arg1 arg2 arg3

$1 的值将是 “arg1″,$2 的值将是 “arg2″,依此类推。

参考

  1. 【export】Linux中export命令介绍,三种方法设置环境变量
  2. shell编程之带参数的函数
  3. Linux set命令详解(Linux修改变量值的set命令)

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

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

相关文章

【RT-DETR进阶实战】利用RT-DETR进行视频划定区域目标统计计数

👑欢迎大家订阅本专栏,一起学习RT-DETR👑 一、本文介绍 Hello,各位读者,最近会给大家发一些进阶实战的讲解,如何利用RT-DETR现有的一些功能进行一些实战, 让我们不仅会改进RT-DETR,也能够利用RT-DETR去做一些简单的小工作,后面我也会将这些功能利用PyQt或者是…

华清作业day56

SQLite特性&#xff1a; 零配置一无需安装和管理配置&#xff1b;储存在单一磁盘文件中的一个完整的数据库&#xff1b;数据库文件可以在不同字节顺序的机器间自由共享&#xff1b;支持数据库大小至2TB&#xff1b;足够小&#xff0c;全部源码大致3万行c代码&#xff0c;250KB…

boot::process::child::wait_until 线程不安全

最近在项目中需要多线程调用子程序。子程序可能工作时间很长&#xff0c;故用 boost::process::child::wait_until 来实现超时功能。 然而&#xff0c;多线程压力测试时&#xff0c;发现有可能导致 core dump。 经查证&#xff0c;是 boost::process::child::wait_until 的一个…

Office 2010下载安装教程,保姆级教程,附安装包和工具

前言 Microsoft Office是由Microsoft(微软)公司开发的一套基于 Windows 操作系统的办公软件套装。常用组件有 Word、Excel、PowerPoint、Access、Outlook等。 准备工作 1、Win7 及以上系统 2、提前准备好 Office 2010 安装包 安装步骤 1.鼠标右击【Office2010(64bit)】压缩…

U3D记录之FBX纹理丢失问题

今天费老大劲从blender建了个模型&#xff0c;然后导出进去unity 发现贴图丢失 上网查了一下 首先blender导出要改设置 这个path mode要copy 然后unity加载纹理也要改设置 这里这个模型的纹理load要改成external那个模式 然后就有了&#xff0c;另外这个导出还有好多选项可…

SSM框架,Spring-ioc的学习(上)

知识点引入 关于框架 框架( Framework )是一个集成了基本结构、规范、设计模式、编程语言和程序库等基础组件的软件系统&#xff0c;它可以用来构建更高级别的应用程序。框架的设计和实现旨在解决特定领域中的常见问题&#xff0c;帮助开发人员更高效、更稳定地实现软件开发目…

nginx upstream server主动健康检测模块ngx_http_upstream_check_module 使用和源码分析(中)

目录 6. 源码分析6.1 解析指令分析6.2 待检查的服务器的添加和状态查询6.3 本模块的进程初始化函数6.4 准备执行健康检测任务6.5 执行健康检测任务本篇对ngx_http_upstream_check_module的源码实现进行详细分析。 关于配置和使用部分可以查看上篇:nginx upstream server主动健…

[word] word中怎么插入另外一个word文档 #媒体#职场发展

word中怎么插入另外一个word文档 word中怎么插入另外一个word文档&#xff1f;有有些小伙伴在制作文档的时候&#xff0c;可能需要用到多个文档进行配合制作&#xff0c;今天小Q来给大家演示一下&#xff0c;插入Word文档的方法&#xff0c;插入其他类型文档的方法也是一样的。…

Backtrader 文档学习- Plotting

Backtrader 文档学习- Plotting 虽然回测是一个基于数学计算的自动化过程&#xff0c;还是希望实际通过可视化验证。无论是使用现有算法回测&#xff0c;还是观察数据驱动的指标&#xff08;内置或自定义&#xff09;。 凡事都要有人完成&#xff0c;绘制数据加载、指标、操作…

RedissonClient妙用-分布式布隆过滤器

目录 布隆过滤器介绍 布隆过滤器的落地应用场景 高并发处理 多个过滤器平滑切换 分析总结 布隆过滤器介绍 布隆过滤器&#xff08;Bloom Filter&#xff09;是1970年由布隆提出的。它实际上是一个很长的二进制向量和一系列随机映射函数。布隆过滤器可以用于检索一个元素是…

汇编笔记 01

小蒟蒻的汇编自学笔记&#xff0c;如有错误&#xff0c;望不吝赐教 文章目录 笔记编辑器&#xff0c;启动&#xff01;debug功能CS & IPmovaddsub汇编语言寄存器的英文全称中英对照表muldivandor 笔记 编辑器&#xff0c;启动&#xff01; 进入 debug 模式 debug功能 …

python-产品篇-游戏-象棋

文章目录 代码效果 代码 import pygame import time import constants from button import Button import pieces import computerclass MainGame():window NoneStart_X constants.Start_XStart_Y constants.Start_YLine_Span constants.Line_SpanMax_X Start_X 8 * Lin…

ChatGPT 变懒最新解释!或和系统Prompt太长有关

大家好我是二狗。 ChatGPT变懒这件事又有了最新解释了。 这两天&#xff0c;推特用户Dylan Patel发文表示&#xff1a; 你想知道为什么 ChatGPT 和 6 个月前相比会如此糟糕吗&#xff1f; 那是因为ChatGPT系统Prompt是竟然包含1700 tokens&#xff0c;看看这个prompt里面有多…

测试管理_利用python连接禅道数据库并自动统计bug数据到钉钉群

测试管理_利用python连接禅道数据库并统计bug数据到钉钉 这篇不多赘述&#xff0c;直接上代码文件。 另文章基础参考博文&#xff1a;参考博文 加以我自己的需求优化而成。 统计的前提 以下代码统计的前提是禅道的提bug流程应规范化 bug未解决不删除bug未关闭不删除 db_…

Springboot+vue的社区智慧养老监护管理平台设计与实现(有报告),Javaee项目,springboot vue前后端分离项目

演示视频&#xff1a; Springbootvue的社区智慧养老监护管理平台设计与实现&#xff08;有报告&#xff09;&#xff0c;Javaee项目&#xff0c;springboot vue前后端分离项目 项目介绍&#xff1a; 本文设计了一个基于Springbootvue的前后端分离的社区智慧养老监护管理平台设…

人工智能专题:量子计算云平台功能模型、体系架构与能力分级研究报告

今天分享的是人工智能系列深度研究报告&#xff1a;《人工智能专题&#xff1a;量子计算云平台功能模型、体系架构与能力分级研究报告》。 &#xff08;报告出品方&#xff1a;量子信息网络产业联盟&#xff09; 报告共计&#xff1a;58页 国内外量子计算云平台发展现状 图1…

18:蜂鸣器

蜂鸣器 1、蜂鸣器的介绍2、编程让蜂鸣器响起来3、通过定时控制蜂鸣器4、蜂鸣器发出滴滴声&#xff08;间歇性鸣叫&#xff09; 1、蜂鸣器的介绍 蜂鸣器内部其实是2个金属片&#xff0c;当一个金属片接正电&#xff0c;一个金属片接负电时&#xff0c;2个金属片将合拢&#xff…

CTFshow web(命令执行 41-44)

web41 <?php /* # -*- coding: utf-8 -*- # Author: 羽 # Date: 2020-09-05 20:31:22 # Last Modified by: h1xa # Last Modified time: 2020-09-05 22:40:07 # email: 1341963450qq.com # link: https://ctf.show */ if(isset($_POST[c])){ $c $_POST[c]; if(!p…

springboot微信小程序 uniapp学习资料分享系统v9uy4

理论意义 当今网络教学已成为各国教育改革 和发展的趋势。因此&#xff0c;构建一个适合交互式课堂教学模式的教学平台就成了当务之 急。 在国内高校&#xff0c;目前交互平台主要用于网络学院的远程教学&#xff0c;至于校园内的正规教学&#xff0c;老师自发建立课程主页的比…

【SpringBoot】JWT令牌

&#x1f4dd;个人主页&#xff1a;五敷有你 &#x1f525;系列专栏&#xff1a;SpringBoot ⛺️稳重求进&#xff0c;晒太阳 什么是JWT JWT简称JSON Web Token&#xff0c;也就是通过JSON形式作为Web应用的令牌&#xff0c;用于各方面之间安全的将信息作为JSON对象传输…