shell程序设计入门(二)

news2024/11/13 14:31:51

shell程序设计入门(二)

  • 导语
  • shell语法
    • 变量
      • 引号
      • 环境变量
      • 参数变量
    • 条件
    • 控制结构
      • if else
      • 循环
        • for
        • while
        • until
      • case
      • AND和OR
        • AND
        • OR
    • 函数
  • 总结
  • 参考文献

导语

shell语法

变量

shell变量和C语言的标识符命名的要求类似,在shell中,可以在变量名前加$访问其内容,然后可以用echo输出它

与echo对应的是read,它用来把用户的输入赋给变量,需要注意的事,脚本文件中参数以空白字符分割,如果一个参数包括多个空白符,就需要用引号引起来,并且单引号和双引号的操作方式是不一样的

引号

如果把$变量表达式放在双引号里,程序执行到该行会把变量替换成应有的值,如果放在单引号里就不会发生替换现象,下面是一个简单的示例程序

#!/bin/sh

string="This is a test"

echo $string
echo "$string"
echo '$string'
echo \$string

echo Please input
read string

echo '$string' now is $string
exit 0

在这里插入图片描述

通过这个程序可以看到单双引号以及echo还有read的使用和区别

环境变量

Linux系统的环境变量和Window其实类似,都是设定好的变量,将它们和用户在脚本中定义的区分开,它们一般是大写,书上给出的常用环境变量如下

在这里插入图片描述

参数变量

脚本在调用的时候是可以提供参数的,即使没有传递参数,环境变量依然存在,只不过它们的值为0,书上给出的参数变量如下

在这里插入图片描述

下面是一个简单的展示脚本相关变量的程序

var="Test"
echo $var
echo "程序$0正在运行$"
echo "第二个参数是$2"
echo "第一个参数是$1"
echo "参数列表是$*"
echo "用户的主目录是$HOME"

echo "请输入变量的新值"
read var

echo $var
echo "程序允许完成"
exit 0

运行的结果如下

在这里插入图片描述

条件

shell里的test/[ 更像是为了完善if判断而衍生的结构,并且由于test这个单词十分常用,甚至很多程序的名字就有,因此用[来搭配if更为常见,具体的字符串比较、算术比较和文件条件测试在使用的时候查阅即可,这里不多赘述

test和[的用法如下

test -f <filename>
[-f <filename>]

与if 搭配的示例如下

if test -f show_var
then
...
fi
#等价于
if [ -f show_var ]
then
...
fi
#等价于
if [ -f show_var ]; then
...
fi

书上给出了一个能够展现对应功能的脚本

if [ -f /bin/bash ]; then
    echo "文件/bin/bash存在"
fi

if [ -d /bin/bash ]; then
    echo "/bin/bash是一个目录"
else
    echo "/bin/bash不是一个目录"
fi

该脚本的目的是检测/bin/bash是否是文件,以及是否是脚本,执行的结果如下

在这里插入图片描述

控制结构

if else

与C语言类似,shell也是用if else语句来实现逻辑上的判断和控制的,不同的是shell的if else更复杂一些,具体用法如下

if condition
then
	statements
elif condition
then
	statements
else
	statemens
fi

这里直接给出书上的参考脚本并解释

c#!/bin/sh
echo "Is it moring? Please answer yes or no"
read timeofday

if [ $timeofday = "yes" ]#探讨这里加不加""
then
	echo "Good morning"
elif [ $timeofday = "no" ]#同上
then
	echo "Good afternoon"
else
	echo "Can't recognized"
	exit 1
fi

exit 0

结果如下

在这里插入图片描述

当然,这里的程序采用的是书上的第二个版本,它的问题是如果在输入的时候直接打回车,会导致timeofday变量没有接受到任何值变为空,于是判断语句的左边便缺失,判断语句无法执行

在shell当中,空和空句并不是一个东西,为了改善这个情况,需要吧$timeofday加上双引号,这样在判断的时候判断语句左边就是空句,就可以进行判断了

循环

for

shell中for的用法很简单,和python或者C++11有点像

for var in values
do
	statements
done

与其他高级程序设计语言不同的是,这里的values是一个列表,里面通常是一些字符串(文件名或参数名

以下是一个使用通配符匹配的简单脚本,它负责找到当前目录下所有f开头的文件并打印它们的名字

for file in $(ls f*); do
    echo $file
done
exit 0

执行的结果如下

在这里插入图片描述

while

while的用法也很简单,它一般用于不知道循环的次数或者持续寻找的情况

while condition; do
	statements
done

以下是书上给出的一个判断密码的简单例子

echo "请输入密码"
read password

while [ "$password" != "password" ]; do
    echo "请重试"
    read password
done
echo "密码正确"
exit 0

运行结果如下

在这里插入图片描述

until

until是C语言没有的关键字,在shell中它与while条件反过来了,也就是循环执行到条件为真,while是循环执行到条件为假,一般来说,如果循环至少执行一次就用while,否则就用until

until condition
do
	statements
done

这里给出上一节while程序的until版本

echo "Enter password"
read input

until [ "$input" = "password" ];do
    echo "wrong password"
    read input
done
exit 0

运行的结果如下

在这里插入图片描述

case

shell中case的用法比较复杂,和C语言的完全不一样,并且花样繁多,例如允许合并匹配、执行多条语句等

在这里插入图片描述

这里直接给出书上的最优程序及其运行结果

echo "Is it morning? Please answer yes or no"
read timeofday

case "$timeofday" in
    yes | y | Yes |YES )
        echo "Good Morning"
        echo "Up bright and early this morning"
        ;;
    [nN]*)
        echo "Good Afternoon"
        ;;
    *)
        echo "Sorry, answer not recognized"
        echo "Please answer yes or no"
        exit 1
        ;;
esac
exit 0

在这里插入图片描述

AND和OR

AND

shell里的and(即&&)和C语言中的&&意思并不一样,它的作用是检查前一条命令的返回值,具体来说

order1 && order2 && order3......

这样的一条shell命令,会从左到右依次执行,如果当前执行的命令返回为true,下一条命令才能执行,否则就停止,可以理解为串联,中间一旦断了,后面都接不上

OR

shell的or(||)和C语言中的||意思也是不一样的,它和&&相反

order1 || order2 || order3......

该shell指令从左到右依次执行,直到执行到第一个返回true的命令或执行完所有命令为止,换句话说,当一条命令的返回值为false,它的下一条命令才能执行,正好和&&相反

函数

作为编程语言,shell同样可以构造函数并提供调用,调用的格式如下,和C语言很像

funciton_name()
{
	statements
}

和C语言一样,shell编程中也会遇到局部变量和全局变量的问题,书上给出了一个相关的脚本如下

#!/bin/sh
sample_text="全局变量"
foo()
{
	local sample_text="局部变量"
	echo "函数foo正在运行"
	echo $sample_text
}

echo "以下为sample_text在函数执行前的值"
echo $sample_text

foo

echo "以下为sample_txt在函数执行后的值"
echo $sample_text

exit 0

下面是运行结果,可以看到,在函数体内是以局部变量优先的

在这里插入图片描述

在此基础上,shell脚本中的函数可以调用脚本的参数作为函数的参数来使用,书上的例子如下

#!/bin/sh

yes_or_no(){
	echo "Is your name $* ?"
	while true
	do
		echo -n "Enter yes or no: "
		read x
		case "$x" in
			y | yes ) return 0;;
			n | no ) return 1;;
			* )		 echo "Answer yes or no"
		esac
	done
}

echo "Original parameters are $*"

if yes_or_no "$1"
then
	echo "Hi $1, nice name"
else
	echo "Never mind"
fi
exit 0

执行的结果如下,可以看到输入的xxx从脚本的参数变成了函数的参数并进入了函数

在这里插入图片描述

总结

由于该章篇幅过多,因此本篇只选择了语法中的变量到函数的部分,需要注意的是shell和C语言有很多相似之处,使用的时候注意理解和区分

参考文献

  1. 《Linux程序设计(第4版)》

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

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

相关文章

“易碎”的留守农村人,都在被AI智能监控“兜住”

文 | 智能相对论 作者 | 陈泊丞 “村里的四伯走了&#xff0c;是第二天傍晚被邻居家的七婶发现的。” 那晚&#xff0c;和家里的父母通电话&#xff0c;他们突然提起了这件事。 四伯虽说是父亲的堂兄弟&#xff0c;但是也只是辈分相当&#xff0c;在年纪上比父亲大上许多。…

零知识证明;Halo2原理;举例说明算术电路、转换为约束系统、多项式承诺举例形式和数值;PLANK算术化;

目录 零知识证明 简单举例说明原理 原理概述 Halo2原理 Halo2原理 举例说明关键性概念 举例说明算术电路、转换为约束系统、多项式承诺举例形式和数值 1. 算术电路构建 2. 转换为约束系统 3. 多项式承诺举例形式和数值 Halo2简单示例 PLANK算术化 基础概念 简单例…

如何维护好客户关系?

在这个信息爆炸、竞争激烈的市场环境中&#xff0c;每一位客户的信任与支持都是我们最宝贵的财富。 今天&#xff0c;就让我们一起探索那些温暖人心的秘诀&#xff0c;学习如何像匠人一样&#xff0c;精心维护与每一位客户的关系&#xff0c;让每一次互动都成为加深情感的桥梁。…

XTuner微调个人小助手认知

1. 环境准备 将Tutorial仓库的资料克隆到本地 mkdir -p /root/InternLM/Tutorial git clone -b camp3 https://github.com/InternLM/Tutorial /root/InternLM/Tutorial 创建一个叫做demo的虚拟环境 # 创建虚拟环境 conda create -n demo python3.10 -y# 激活虚拟环境&…

c#实现生成AES加密的密钥key(密钥长度128位,也就是32个字符)对标Java中的AES加密(SHA1PRNG+Hex.encodeHexString)

最近在做某省份的一个健康云平台检验结果互认&#xff0c;我们的系统用的是C#&#xff0c;里面要求生成一个AES加密的密钥key&#xff08;密钥长度128位&#xff0c;也就是32个字符&#xff09;&#xff0c;后面要用这个密钥key完成一系列加密操作&#xff0c;给的实例只有Java…

http应用层协议

一、万维网 用来存放各种资源的网络。 1、如何在万维网中表示一个资源 ? url ——统一资源定位符&#xff1b; 形式&#xff1a; <协议>://<主机>:<端口>/<路径>&#xff1b; <主机>:<端口>/<路径> //表示了资源所在的…

彩色墨水屏(电子纸)智能工牌,开启职场未来想象

随着技术的进步和生活方式的变革&#xff0c;越来越多职场人士希望佩戴的工牌能够展现独特的个人风格和专业特点&#xff0c;实现自动打卡、门禁管理等功能&#xff0c;提高工作效率&#xff0c;让职场生活更加便捷。 ​因此&#xff0c;快节奏的现代职场需一个既能满足员工对…

shadertoy sdSegment 原理

sdSegment 原理 float sdSegment( in vec2 p, in vec2 a, in vec2 b ) {vec2 pa p-a, ba b-a;float h clamp( dot(pa,ba)/dot(ba,ba), 0.0, 1.0 );return length( pa - ba*h ); }原理: u ⃗ \vec{u} u 在 v ⃗ \vec{v} v 在夹角是 θ \theta θ 的投影长度是: &#xff…

HTML5休闲小游戏《猫猫咖啡店》源码,引流、刷广告利器

HTML5休闲小游戏《猫猫咖啡店》源码&#xff0c;直接把源码上传到服务器就能使用了&#xff01; 下载链接&#xff1a;https://www.huzhan.com/code/goods468502.html

vscode修改选中文字颜色及当前tab颜色

VSCode-》首选项-》设置->-》搜color&#xff0c;找到&#xff1a;Workbench&#xff1a;Color Customizations&#xff0c;点击&#xff1a;在 settings.json 中编辑 加上 选中的文字内容的 配置 "workbench.colorCustomizations": {//设置用户选中代码段的颜色&…

贪心+栈。。

前言&#xff1a;这个题目一开始我没想通的就是如果s当前的一个字符或者之后的一个字符和当前t的尾巴是一样的&#xff0c;那么优先选哪一个&#xff0c;其实这个就要优先选t的 class Solution { public:string robotWithString(string s) {string ans;int cnt[26]{}, min 0; …

2024年AI编程新手必备工具,快速提升技能!

在当今这个技术日新月异的时代&#xff0c;AI编程已成为一个越来越重要的领域&#xff0c;吸引着众多新手和希望提升自己的中级开发者进入。 对于这些渴望在AI领域快速成长的人来说&#xff0c;选择合适的编程工具是至关重要的。 接下来&#xff0c;我们将深入探讨几款市场上…

Ubuntu22.04下安装LDAP

目录 1 简单说明2 安装配置2.1 安装1、安装前准备2、安装 OpenLADP3、配置OpenLDAP4、设置基本组5、添加新组5、添加 OpenLDAP 用户 2.2 安装 LDAP 帐户管理器1、安装2、配置 LDAP 帐户管理器 3 简单使用3.1 创建一个组3.2 创建一个用户 总结 1 简单说明 之前写过在Centos下的…

LLaVA 简介

好奇这张照片是在哪里拍摄的&#xff1f;问 LLaVA&#xff01;&#xff08;图片来自Pixabay的Guy Rey-Bellet&#xff09;。 LLaVA&#xff08;L arge L anguage 和V isual A ssistant 的缩写&#xff09;是一种很有前途的开源生成式人工智能模型&#xff0c;它复制了 OpenAI …

Arduino 定时器 [终极指南](原文)

Arduino Timers [Ultimate Guide] by Khaled Magdy In this tutorial, we’ll discuss Arduino Timers from the very basic concepts all the way to implementing Arduino timer-based systems. We’ll start off by discussing what is a timer, how they work, and what …

最近公共祖先(LCA),树上差分,树的直径总结

最近也是一不小心就学到了树论&#xff0c;这方面确实太不行了&#xff0c;也该开始学习一下了&#xff0c;那么话不多说&#xff0c;进入今日份的树论学习&#xff0c;直接开冲 最近公共祖先&#xff08;LCA&#xff09;——倍增思想&#xff08;可以结合我之前写的ST表学习&…

Windows安装java8\java17并存切换版本操作

问题描述&#xff1a; 首先肯定一台电脑可以安装多个JDK&#xff0c;切换版本也是可实现的。 存在版本切换问题是企业项目用java8&#xff0c;个人研究技术用的17。希望两者并存&#xff0c;随时切换&#xff0c;记录一下操作步骤。 第一&#xff1a;先安装不同版本的jdk到系…

vue项目中,修改elementui一些复杂控件样式

1.前言 在vue项目中&#xff0c;我们为了快速开发&#xff0c;会用到elementui。但很多时候&#xff0c;elementui的样式不满足于我们项目的样式需求。这时候我们需要修改原生elementui的样式。 2.简单控件的样式修改 对于elementui中一些简单的控件&#xff0c;如按钮之类的…

Xshell链接本地20.04Ubuntu虚拟机

一、打开虚拟机设置选择自定义-net8 二、打开虚拟网络编辑器&#xff0c;点击更改设置 三、打开网络设置&#xff0c;如图操作 四。打开虚拟机&#xff0c;进入终端&#xff0c;输入ifconfig 五、su root进入root模式&#xff0c;配置静态网卡 # 备份配置文件 cd /etc/netpla…

Qt:玩转QPainter序列一

前言 最近想潜心研究一下QPainter这个类&#xff0c;最好把QPainter所有的函数都敲一遍&#xff0c;特地记录一下。 在说QPainter之前我们需要了解两个非常重要的东西 第一个坐标系 我用两张图来表示 代码实操的结果 更加详细的坐标系内容请看我的另一篇博客 第二个是有…