Linux-4:Shell编程——基础语法(50%-100%)

目录

前言

一、数组

1.数组定义

2.关联数组

3.数组长度

二、运算符

1.算术运算符

2.关系运算符

3.布尔运算符

4.逻辑运算符

5.字符串运算符

6.文件测试运算符

三、read命令

1.接收用户输入

2.开启转义

3. -p 输入提示

4. -s 静默模式  -t 设置超时时间

5.读取多个参数

四、格式化字符串

总结


前言

Shell编程——基础语法前半篇:Linux-3:Shell编程——基础语法(0-50%)-CSDN博客

 

一、数组

  • 数组中可以存放多个值。Bash Shell 只支持一维数组(不支持多维数组),
  • 初始化时不需要定义数组大小。 与大部分编程语言类似,数组元素的下标由 0 开始。
  • Shell 数组用括号来表示,元素用"空格"符号分割开,

1.数组定义

两种定义方式

#!/bin/sh
# 数组
array=(1 2 A 4)
echo ${array[*]}   # 数组取值 * 取全部 
echo ${array[1]}   # 下标取值 # 第二种定义方式
array1[0]=h
array1[1]=i
array1[2]=j
array1[3]=k
echo ${array1[@]}   #  @ * 取全部
echo ${array1[1]}
echo ${#array1[@]}
echo ${array1[*]}

输出:@ * 均能取全部的值

1 2 A 4
2
h i j k
i
4
h i j k

 

2.关联数组

  • 嗯!是熟悉的味道
#!/bin/sh# 关联数组 就是字典
declare -A dict=(["google"]="www.google.com" ["taobao"]="www.taobao.com")
echo ${dict["google"]}declare -A dict_a
dict_a["sogou"]="www.sogou.com"
dict_a["google"]="www.google.com"
dict_a["taobao"]="www.taobao.com"
echo ${dict_a["sogou"]}

输出:关联数组通过键取值,且键必须唯一

www.google.com
www.sogou.com

 

3.数组长度

#!/bin/shdeclare -A dict=(["google"]="www.google.com" ["taobao"]="www.taobao.com")declare -A dict_a
dict_a["sogou"]="www.sogou.com"
dict_a["google"]="www.google.com"
dict_a["taobao"]="www.taobao.com"# 数组长度           #  # 计算总数  @ * 取全部
echo ${#dict[@]}
echo ${#dict_a[*]}

输出注意 !!! # 计算总数       @ * 取全部

2
3

 

二、运算符

1.算术运算符

#!/bin/sh
# 运算符# 算术运算符
a=`expr 2 + 2 `
echo "两数之和为:$a"
b=`expr 2 - 2`
c=`expr 2 \* 2`      # 乘需要转义\*
d=`expr 2 / 2`
e=`expr 2 % 2`
echo $b $c $d $e# 第二种表达方式  $((表达式)) 
a1=$((2+2))   
b1=$((2-2))
c1=$((2*2))
d1=$((2/2))
e1=$((2%2))
f1=$(($b1==$e1))
f2=$(($a1>=$b1))
echo $a1 $b1 $c1 $d1 $e1 $f1 $f2

输出:注意第一种表达中乘法需要转义*

两数之和为:4
0 4 1 0
4 0 4 1 0 1 1

 

2.关系运算符

  • eq即equal  ne即not equal   g即great  t即than l即less  

 

举例:

#!/bin/sha1=$((2+2))   
b1=$((2-2))# 关系运算符   -eq == | -ne != | -gt > | -lt < | -ge >= | -le <=
if [ $a1 -eq $b1 ];
then echo "a1==b1"
elseecho "a1!=b1"
fi

输出:

a1!=b1

 

3.布尔运算符

举例:

#!/bin/sh# bool运算符 -a -o !  与 或 非
a=10
b=20
if [ $a -gt 11 -o $b -lt 25 ];
thenecho "a大于11 或 b小于25"
elseecho "两个都为假"
fiif [ ! $a -ne 10 ];    
then echo "a等于10"
elseecho "a不等于10"
fi

输出:

a大于11 或 b小于25
a等于10

 

4.逻辑运算符

举例:

#!/bin/sh# 逻辑运算符 && ||   与 或   返回布尔值
if [[ $a -gt 5 && $b -lt 21 ]];
thenecho "both true"
elseecho "have false"
fi

输出:注意逻辑算符外用的是两个中括号[[ ]]

have false

 

5.字符串运算符

举例:

#!/bin/sh# 字符串运算符 =  != -n -z(检测是否为0) $(检测是否不为空)
unset cc
if [ -n "$cc" ];      # ""引起来 判断是否有字符
then echo "$cc"echo "cc长度不为0"   
else echo "cc长度为0"
fi

输出:判断时需要用引号将变量引起来

cc长度为0

 

6.文件测试运算符

  •  虽然看着唬人 但是我们只需要知道 -d -f -x 的用法即可

举例:

#!/bin/sh# 文件测试运算符
dirs='/root/shell_code'
if [ -d $dirs ];
thenecho "${dirs}是一个文件夹"
elseecho "${dirs}不是一个文件夹"
fiecho "------------------------------"
files="./demo1.sh"
if [ -f $files  ];
thenecho "${files}是一个文件"
else echo "${files}不是一个文件"
fiecho "---------------------------"
if [ -x $files ];
then echo "${files}是一个可执行文件"
elseecho "${files}不是一个可执行文件"
fi

输出:

/root/shell_code是一个文件夹
------------------------------
./demo1.sh是一个文件
---------------------------
./demo1.sh不是一个可执行文件

 

三、read命令

 

1.接收用户输入

  • 类似于python里的inpu命令
#!/bin/sh# 接收用户输入 
read name
echo he is $name

输出:程序会获取用户输入的值,将其赋值给变量

hhh
he is hhh

 

2.开启转义

举例:

#!/bin/sh# 开启转义
echo  -e "ok \n"
echo -e "aaaaa \c "     # \c 不换行
echo "hhhhh"
echo ` ps `

输出:

ok aaaaa hhhhh
PID TTY TIME CMD 3450 pts/1 00:00:00 bash 5633 pts/1 00:00:00 sh 5634 pts/1 00:00:00 ps

 

3. -p 输入提示

举例:

# -p 输入提示
read -p "请输入您的年龄"   age
echo "才${age}岁! 您还很年轻呢!"

输出:

请输入您的年龄23
才23岁! 您还很年轻呢!

 

4. -s 静默模式  -t 设置超时时间

#!/bin/sh# -s 静默模式  -t 设置超时时间
read -p "请输入你的密码:"  -s -t 10 passwd
echo
echo "你的密码是:${passwd}"  

输出:静默模式下 输入的内容不会显示出来  -t 设置超过十秒后自动退出程序

请输入你的密码:
你的密码是:12345

 

5.读取多个参数

  • 读取多个参数 中间用空格隔开

举例:

#!/bin/sh# 读取多个参数 中间用空格隔开
read -p "请输入多个参数"  name age sex
echo $name $age $sex# 判断两次输入的密码是否相同
if read -t 20 -sp "请输入密码:" pass1 && echo &&read -t 20 -sp "请再次输入密码:" pass2 && echo &&[ $pass1 == $pass2 ];
thenecho "it's ok"
else    echo "it's failed"
fi

输出:

请输入多个参数hhhh aaaa
hhhh aaaa
请输入密码:
请再次输入密码:
it's failed

 

四、格式化字符串

  • python有format
  • shell有printf

举例:

#!/bin/sh# printf 格式化字符串printf "%-10s %-8s %-4s\n" 姓名 性别 体重kg        # 使用 - 指定宽度
printf "%-10s %-8s %-8.2s\n" 郭靖 男 66.66666
printf "%-10s %-8s %-4.2s\n" zs man 88.8888       # 用英文时宽度是正常的printf "%d %s\n" 1 "abc" 
printf '%d %s\n' 1 "abc"   # 只有在这里单引号不会将其他符号转换成字符串printf %s abcdef"\n"
echo
printf %s abc def     # 只指定了一个参数 有两个字符串 %s被重复使用
echo
printf "%s %s %s \n"  a b c d e f h i j k l  # %s %s %s \n 被复用printf "%s %d %f %c \n"  # %s用空代替 %d %f用0代替

输出:

  • 英文字母通常使用ASCII码或Unicode编码的基本拉丁字母范围,每个字符占据一个固定的字节或字符宽度。例如,ASCII码中的大部分字母字符都是一个字节(8位)。
  • 汉字则通常使用Unicode编码的中文字符集(如UTF-8编码),每个汉字通常占据3个字节(UTF-8编码下的标准长度),有时可能更多。
姓名     性别   体重kg
郭靖     男      66      
zs         man      88  
1 abc
1 abc
abcdef\n
abcdef
a b c 
d e f 
h i j 
k l  0 0.000000  

 

总结

这里虽然用了if选择结构,但是很简单易懂,shell的选择和循环下一篇文章会讲。

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

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

相关文章

Fiddler学习笔记

目录 前言 简介 原理 界面 前言 测试可以使用fiddler工具&#xff0c;通过抓包的方式修改前端参数和模拟后端返回&#xff0c;快速定位缺陷。 简介 Fiddler是HTTP协议调试代理工具&#xff0c;可以记录并检查所有客户端和服务器之间的HTTP和HTTPS请求&#xff0c;允许监视…

算法训练1

01背包问题 背包状态方程----动态规划 二维dp 使用 f[i][j] max(f[i-1][j] ,f[i-1][j - w[i]] v[i]); 伪代码&#xff1a; int dp[100][100]; void test6() {int n; //装备数量int m; //背包容量int v[105], w[105]; //前面空间&#xff0c;后面价值for (int i 1; i &l…

ONLYOFFICE文档:为企业和开发者带来强大的文档编辑功能

本文给大家介绍一个开源项目&#xff1a;ONLYOFFICE文档&#xff0c;它能够为文档编辑、多人协作提供强大支持。无论你是个人使用&#xff0c;还是企业、商业开发&#xff0c;都能找到适合你的版本。 关于 ONLYOFFICE 文档 ONLYOFFICE 文档是一套功能强大的文档编辑器&#x…

微信小程序获取AppSecret的步骤

文章目录 微信小程序获取AppSecret的步骤&#xff1a;注意&#xff1a; 微信公众平台 小程序的密钥&#xff08;或称为AppSecret&#xff09;是用于加密解密、验证服务器身份等安全操作的敏感信息。不同的平台&#xff08;如微信小程序、支付宝小程序、百度智能小程序等&am…

vulhub:Apache解析漏洞apache_parsing

在Apache1.x/2.x中Apache 解析文件的规则是从右到左开始判断解析&#xff0c;如果后缀名为不可识别文件解析&#xff0c;就再往左判断。如 1.php.xxxxx 漏洞原理 Apache HTTPD 支持一个文件拥有多个后缀&#xff0c;并为不同后缀执行不同的指令。比如如下配置文件 AddType te…

【C#】.net core 6.0 webapi 使用core版本的NPOI的Excel读取数据以及保存数据

欢迎来到《小5讲堂》 这是《C#》系列文章&#xff0c;每篇文章将以博主理解的角度展开讲解。 温馨提示&#xff1a;博主能力有限&#xff0c;理解水平有限&#xff0c;若有不对之处望指正&#xff01; 目录 背景读取并保存NPOI信息NPOI 插件介绍基本功能示例代码写入 Excel 文件…

算法小白的进阶之路(力扣1~5)

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 非常期待和您一起在这个小…

花几千上万学习Java,真没必要!(三十九)

1、BufferedReader的使用&#xff1a; 测试代码&#xff1a; package test.com; import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; import java.util.ArrayList; import java.util.List; public class FileReadToList { pu…

使用 openai 和 langchain 调用自定义工具完成提问需求

我们提供了一个函数&#xff0c;接受传入运算的字符串&#xff0c;返回运算的结果。 现在的需求是&#xff0c;我们问 gpt 模型&#xff0c;由于模型计算能力并不好&#xff0c;他要调用计算函数&#xff0c;根据计算结果&#xff0c;回答我们的问题。 使用 openai 实现&#…

发布NPM包详细流程

制作 首先需要制作一个npm包。 按照以下步骤依次执行。 mkdir my-npm-package cd my-npm-package npm init 相信这一步不需要过多的解释&#xff0c;就是创建了一个文件夹&#xff0c;然后初始化了一下文件夹。 然后在生成的package.json文件夹中更改一下自己的配置&…

优化冗余代码:提升前端项目开发效率的实用方法

目录 前言代码复用与组件化模块化开发与代码分割工具辅助与自动化结束语 前言 在前端开发中&#xff0c;我们常常会遇到代码冗余的问题&#xff0c;这不仅增加了代码量&#xff0c;还影响了项目的可维护性和开发效率。还有就是有时候会接到紧急业务需求&#xff0c;要求立马完…

这两个大龄程序员,打算搞垮一个世界软件巨头!

大家都知道&#xff0c;Adobe是多媒体和数字内容创作者的绝对王者&#xff0c;它的旗下有众多大家耳熟能详的软件&#xff1a;Photoshop、Illustrator、Premiere Pro、After Effects、InDegign、Acrobat、Animate等等。 这些软件使用门槛很高&#xff0c;价格昂贵&#xff0c;安…

遗传算法与深度学习实战——生命模拟及其应用

遗传算法与深度学习实战——生命模拟及其应用 0. 前言1. 康威生命游戏1.1 康威生命游戏的规则1.2 实现康威生命游戏1.3 空间生命和智能体模拟 2. 实现生命模拟3. 生命模拟应用小结系列链接 0. 前言 生命模拟是进化计算的一个特定子集&#xff0c;模拟了自然界中所观察到的自然…

大模型之多模态大模型技术

本文作为大模型综述第三篇,介绍语言大模型多模态技术。 不同于语言大模型只对文本进行处理,多模态大模型将文本、语音、图像、视频等多模态数据联合起来进行学习。多模态大模型融合了多种感知途径与表达形态, 能够同时处理和理解来自不同感知通道(例如视觉、听觉、语言和触…

麒麟系统查看和修改ip

查看ip ifconfig ifconfig enp0s3 192.168.1.110

使用Echarts来实现数据可视化

目录 一.什么是ECharts? 二.如何使用Springboot来从后端给Echarts返回响应的数据&#xff1f; eg:折线图&#xff1a; ①Controller层&#xff1a; ②service层&#xff1a; 一.什么是ECharts? ECharts是一款基于JavaScript的数据可视化图标库&#xff0c;提供直观&…

javaScript中的对象

创建 this指向 命名规则 不符合变量名的命名规则和规范使用数组关联语法获取 遍历对象 使用for&#xff08;var key in 对象&#xff09; 删除属性 对象引用关系

Flutter大型项目架构:私有组件包管理

随着项目功能模块越来越多&#xff0c;怎么去管理这些私有组件包是一个不得不面对的问题&#xff0c;特别对于团队开发来讲&#xff0c;一些通用的公共组件往往会在多个项目间使用&#xff0c;多的有几十个&#xff0c;每个组件包都有有自己的版本&#xff0c;组件包之间还有依…

一篇文章带你入门爬虫并编写自己的第一个爬虫程序

一、引言 目前我们处在一个信息快速迭代更新的时代&#xff0c;海量的数据以大爆炸的形式出现在网络之中&#xff0c;相比起过去那个通过广播无线电、书籍报刊等传统媒介获取信息的方式&#xff0c;我们现在通过网络使用搜索引擎几乎可以获得任何我们需要的信息资源。 但与此同…

Vue前端工程

创建一个工程化的vue项目 npm init vuelatest 全默认回车就好了 登录注册校验 //定义数据模型 const registerDataref({username:,password:,rePassword: }) //校验密码的函数 const checkRePassword(rule,value,callback)>{if (value){callback(new Error(请再次输入密…