Linux Shell编程之数组及参数传递

2023-11-13

在这里插入图片描述

1、Shell数组

Bash Shell 只支持一维数组(不支持多维数组),初始化时不需要定义数组大小,数组元素的下标由 0 开始,下标可以是整数或算术表达式,其值应大于或等于 0。

1.1、定义数组

语法

数组名=(值1 值2 … 值n)

或者

数组名=(

值1

值2

值n)

或者

数组名[下标]=值 注:可以不使用连续的下标,而且下标的范围没有限制

在 Shell 中,用括号来表示数组,数组元素用"空格"符号分割开

案例

自定义一个数组

[root@root test02]# vim test03.sh 
array_string=(a s c v bb)
echo "第一个元素为:${array_string[0]}"
[root@root test02]# ./test03.sh 
第一个元素为:a

1.2、读取数组

语法

${数组名[下标]}

下标说明

  • 下标必须大于或等于 0
  • 下标不能超过数组的大小范围
  • 可以使用@ 或者*代表所有元素的下标

案例

​ 取出array_string中的元素

[root@root test02]# vim test03.sh 
array_string=(a s c v bb)
echo "第一个元素为:${array_string[0]}"
echo "取出数组中所有的元素:${array_string[*]}"
echo "取出数组中所有的元素:${array_string[@]}"
[root@root test02]# ./test03.sh 
第一个元素为:a
取出数组中所有的元素:a s c v bb
取出数组中所有的元素:a s c v bb

1.3、获取数组长度

语法

获取单个元素的长度

${#数组名[下标]}

获取数组的长度

${#数组名[@]}或 ${#数组名[*]}

下标说明

  • 当下标是具体的数字时,所获取的长度为当前元素大小

    • 语法:${#数组名[具体的数]}
  • 当下标为@*时,代表的是数组的长度

  • ${#数组名[@]} 或 ${#数组名[*]}

案例

获取数组的长度

[root@root test02]# vim test03.sh 
array_string=(a s c v bb)
echo "第一个元素为:${array_string[0]}"
echo "取出数组中所有的元素:${array_string[*]}"
echo "取出数组中所有的元素:${array_string[@]}"
echo "获取数组的长度:${#array_string[@]}"
echo "获取数组中第五个元素的长度:${#array_string[4]}"
[root@root test02]# ./test03.sh 
第一个元素为:a
取出数组中所有的元素:a s c v bb
取出数组中所有的元素:a s c v bb
获取数组的长度:5
获取数组中第五个元素的长度:2

2、Shell传递参数

Shell传递参数即可以在执行 Shell 脚本时,向脚本传递参数,类似于位置参数变量和预定义参数

参数 作用
$n n 为数字, $0 代表命令本身,$1-$9 代表第一到第九个参数,十以上的参数,十以上的参数需要用大括号包含,如${10}
$* 代表命令行中所有的参数,把所有的参数看成一个整体
$@ 代表命令行中所有的参数,把每个参数区分对待
$# 代表命令行中所有参数的个数
$$ 当前进程的进程号(PID)
$! 后台运行的最后一个进程的进程号(PID)
$? 最后一次执行的命令的返回状态。 0表示正确执行;其他数字表示执行不正确。

:$*与 $@ 区别

  • 相同点:都是引用所有参数。
  • 不同点:只有在双引号中体现出来。假设在脚本运行时写了三个参数 1、2、3,则 * 等价于 “1 2 3”(传递了一个参数),而 @等价于 “1” “2” “3”(传递了三个参数)。

案例

[root@root test02]# vim test01.sh 

#!/bin/bash
echo "$0 $1 $2"
echo "$*"
echo "$@"
echo "参数总个数为=$#"
[root@root test02]# ./test01.sh 10 11
./test01.sh 10 11
10 11
10 11
参数总个数为=2

#$0 表示本身
#$1 表示第一个参数



[root@root test02]# vim test01.sh 
echo "当前进程的id=$$"
./test01.sh $
echo "后台最后一个进程的id=$!"
echo "执行的值=$?"
[root@root test02]# test01.sh
当前进程的id=25994

3、Shell echo

Shell echo主要用于字符串的输出,在shell中经常使用。

语法

echo [参数] [需要输出的内容]

参数

  • -e 开启转义

输出内容

  • 普通文本
  • 变量
  • 转义字符
  • 结果定向输出
  • 输出执行结果,注意: 这里使用的是反引号 `, 而不是单引号 '

案例

1.输出普通字符串

[root@root test02]# echo "hello world"
hello world
[root@root test02]# echo hello world
hello world
[root@root test02]# echo 'hello world'
hello world

2.输出变量

[root@root test02]# echo $PATH
/usr/java/jdk1.8.0_221-amd64/bin:/usr/java/jdk1.8.0_221-amd64/jre/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin


3.转义输出

#普通输出
[root@root test02]# echo "It is a test"
It is a test
#需要带引号,此时可以转义
[root@root test02]# echo "\"It is a test\""
"It is a test"

#-e 开启转义
[root@root test02]# echo -e "OK! \c" 

4.结果定向输出

[root@root test02]# echo "hello shell" > helloTwo.java
[root@root test02]# tac helloTwo.java 
hello shell

5.输出执行结果

[root@root test02]# vim test01.sh 

sum=0
for((i=0;i<=100;i++))
do
    sum=$[ $sum + $i]
done
echo "1-100的和为:total=$sum"
[root@root test02]# ./test01.sh 
1-100的和为:total=5050

4、Shell printf

Shell printf和echo类似,都主要用于字符串的输出,但是printf的可移植性更好。在printf 中可以使用格式化字符串,还可以定制字符串的宽度、左右对齐方式等。默认情况下 printf 不会自动添加换行符,需要手动添加 \n

语法

printf 格式化字符串 [参数列表]

格式化字符串

格式化字符串 作用
%s 输出一个字符串 NUll
%d 整型输出 0
%c 输出一个字符 Null
%f 输出实数,以小数形式输出 0.0
%b 相对应的参数被视为含有要被处理的转义序列之字符串。

格式化后的参数

  • - 表示左对齐,
  • 没有 表示右对齐
  • n 数字,表示宽度或者精度,如果表示宽度时字符没有达到规定的宽度,则以空格表示,超过也会将内容全部显示出来。

案例

[root@root /]# printf "%d %s\n" 1 "abc"
1 abc
[root@root /]# printf '%d %s\n' 1 "abc"
1 abc
[root@root /]# printf %s abcdef
abcdef[root@root /]# 
[root@root /]# printf %s\n abcdef
abcdefn[root@root /]# 
[root@root /]# printf "%s\n" abc def
abc
def
[root@root /]# printf %s abc def
abcdef[root@root /]# printf "%s\n" abcdef
abcdef
[root@root /]# printf "%s %s %s\n" a b c d e f g h i j
a b c
d e f
g h i
j  
[root@root /]# printf "%s and %d \n"
 and 0 

转义序列

序列 说明
\n 换行(常用)
\r 回车
\t 水平制表符

在这里插入图片描述
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Linux Shell编程之数组及参数传递 的相关文章

随机推荐

  • 函数的传递方式&不定长参数&参数解包

    文章目录 1 函数简介 2 函数的参数 2 1 形参和实参 2 2 函数的传递方式 2 2 1 位置传参 2 2 2 关键字传参 2 3 函数的实参类型 2 4 不定长参数 2 5 参数的解包 1 函数简介 函数也是一个对象 函数用来保存一
  • C++ 模板特例化

    文章目录 介绍 函数模板特例化 类模板特例化 介绍 模板作为C 泛型编程的基础十分重要 其使得一份代码能用于处理多种数据类型 而有些时候 我们会希望对一些特定的数据类型执行不同的代码 这时就需要使用模板特例化 template specia
  • Echarts 渐变色

    series i line itemStyle normal color Color Function default 自适应 图形的颜色 默认从全局调色盘 option color 获取颜色 颜色可以使用 RGB 表示 比如 rgb 12
  • Java技术栈,从入门到放弃,废了废了

    Java技术路线 应用框架 后端 Spring家族 Spring IoC AOP Spring MVC Spring Boot 自动配置 开箱即用 整合Web 整合数据库 事务问题 整合权限 Shiro Spring Security 整合
  • 开放集识别

    0 摘要 1 到目前为止 在计算机视觉中 几乎所有基于机器学习的识别算法的实验评估都采用了封闭集识别的形式 即在训练时已知所有测试类 对于视觉应用来说 一个更现实的场景是开放集识别 在训练时存在不完整的世界知识 在测试时未知的类可以提交给算
  • Vscode 打开文件注释中文乱码解决如下

    安装插件 ext install gbktoutf8 搜索encoding
  • 【LINUX计算机大白平凡学习linux之路】

    计算机大白平凡学习 之路 千里之行 始于足上 只有基础扎实 思路清析 写脚本才没有问题 多看一些牛人大咖写的脚本 看人家的思路与结构 会收益良多 一起努力学习吧 Linux是Torvalds先生所开发出来的 基于GPL的版权宣告之下 可以在
  • 神经网络优化(初始化权重)

    使隐藏层饱和了 跟之前我们说的输出层饱和问题相似 对于输出层 我们用改进的cost函数 比如cross entropy 但是对于隐藏层 我们无法通过cost函数来改进 更好的方法来初始化权重 因为传统的初始化权重问题是用标准正态分布 均值为
  • CentOS7.6 MySql 5.7.34安装部署

    一 卸载Mysql 查看系统是否安装默认的mysql rpm qa grep i mysql 如有 进行卸操作 rpm e nodeps 确认是否卸载完成 whereis mysql cd find name mysql cat etc p
  • 一种新型神经网络正在帮助物理学家应对数据分析的艰巨挑战

    来源 ScienceAI 本文约3000字 建议阅读5分钟 现在 在计算端 计算机科学往往处于领先地位 假设你有一本一千页的书 但每一页只有一行文字 你使用扫描仪提取书中包含的信息 这个特定的扫描仪系统地扫描每一页 一次扫描一平方英寸 要花
  • crmeb v4.3部署流程

    运行环境 CRMEB v4支持Lunix windows服务器环境 需要PHP7 1 7 3 版本支持 可运行于包括Apache和nginx在内的多种WEB服务器和模式 支持Mysql数据库 引擎用InnoDB 框架本身没有什么特别模块要求
  • Pyinstaller 打包.py生成.exe的方法和报错总结

    Pyinstaller 打包 py生成 exe的方法和报错总结 简介 有时候自己写了个python脚本觉得挺好用想要分享给小伙伴 但是每次都要帮他们的电脑装个python环境 虽然说装一下也快 但是相对来说效率还是不高 要是能将python
  • 【AI &Data Science】第 1 章分析性思维与 人工智能驱动的企业

    大家好 我是Sonhhxg 柒 希望你看完之后 能对你有所帮助 不足请指正 共同学习交流 个人主页 Sonhhxg 柒的博客 CSDN博客 欢迎各位 点赞 收藏 留言 系列专栏 机器学习 ML 自然语言处理 NLP 深度学习 DL fore
  • DHCP设置之起始地址与结束地址

    路由器设置ip地址 subnet mask dhcpstart dhcpend时 后台应该如何判断 get data ipstart websGetVar wp T start T ipend websGetVar wp T end T i
  • do while(0)的作用

    在嵌入式开发的过程中 我们经常可以在一些优秀开源代码的头文件里发现一些宏定义使用了do while 0 语句 也许你会疑惑do while 0 中的代码不就是只执行一次吗 为什么还要多此一举使用do while 0 循环结构去包裹呢 实际上
  • 卷积、池化、激励函数的顺序

    以下内容为个人的看法 顺序 卷积 池化 激励函数 我们知道卷积肯定是在第一层 毕竟 wx b wx b 就是卷积操作 那为什么池化要在激励函数之前呢 原因解析 假设激励函数是 relu 激励函数 并假设我们卷积后的值为 3 2 1 2 对于
  • 【总结】Typescript 结合Vue3的写法

    目录 前言 一 结合写法 1 ref 2 reactive 3 defineProps 4 defineEmits 5 computed 6 事件处理函数 7 html元素引用 8 组件实例 二 拓展补充 1 keyof 操作符 2 typ
  • 把代码做成笔记——Jupyter Notebook

    此文章首发于微信公众号Python for Finance 链接 https mp weixin qq com s KDCmpgwPbvrkRIuojtLpNg 什么是Jupyter Notebook Spyder Spyder代码编辑区
  • [算法]最大子串和

    题目描述 首先有一串数字 共有n个 从n个数中找到连续子序列和的最大值 解法一 暴力破解法 看到这个问题时第一时间想到的就是暴力破解法 遍历所有子序列 最终得到最大值 e g 1 2 3 4 5 6 共有六个数 所有组合为 1 2 3 4
  • Linux Shell编程之数组及参数传递

    1 Shell数组 Bash Shell 只支持一维数组 不支持多维数组 初始化时不需要定义数组大小 数组元素的下标由 0 开始 下标可以是整数或算术表达式 其值应大于或等于 0 1 1 定义数组 语法 数组名 值1 值2 值n 或者 数组