上篇博客已经分析重温了shell的运行方式以及其中的变量还有字符串,之后按照套路就是数组方面了,废话不多说,直接进入正题哈。(小白笔记,各位看官勿喷。。。)

    bash shell呢,支持一位数组,不支持多维数组,并且没有限定数组的大小,类似于C语言,元素的下标由0开始编号,下表可以是整数或者算术表达式,其值应大于或者等于0,在shell中用括号来表示数组,数组中的元素用空格来分割开来。定义数组的一般形式为:

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

    例如:

array_name=(value0 value1 value2 value3)

    或者:

array_name=(
value0
value1
value2
value3
)

    还可以单独定义数组中的各个元素:

array_name[0]=value0
array_name[1]=value1
array_name[n]=valuen

    定义晚了数组之后就要开始使用了,首先就是读取:

${数组名[下标]}

    例如:

valuen=${array_name[n]}

    使用@符号可以获取数组中的所有元素,例如:

echo ${array_name[@]}

    还有就是获取我们定义的数组的长度了:

# 取得数组元素的个数
length=${#array_name[@]}
# 或者
length=${#array_name[*]}
# 取得数组单个元素的长度
lengthn=${#array_name[n]}

    好了,现在数组也定义了,长度也能获取了,接下来,理所应当必须是各种循环来处理数组啊。。。

    先来一个if判断的语法格式开开胃:

if condition
then
command1
command2
...
commandN
else
command
fi

    既然都有if判断了,那么elseif也同样:

if condition1
then
command1
elif condition2
then
command2
else
commandN
fi

    下面就给大家来个实例了:

a=10
b=20
if [ $a == $b ]
then
echo "a 等于 b"
elif [ $a -gt $b ]
then
echo "a 大于 b"
elif [ $a -lt $b ]
then
echo "a 小于 b"
else
echo "没有符合的条件"
fi

    输出的结果为:

a 小于 b

    既然都说到这里了,再跟大家介绍一个比较实用的,test(用于检测某个条件是否成立,可以进行数值,字符和文件三个方面的检测,后文会有详解):

num1=$[2*3]
num2=$[1+5]
if test $[num1] -eq $[num2]
then
echo '两个数字相等!'
else
echo '两个数字不相等!'
fi #输出结果:两个数字相等

    接下来就是重头戏了,for循环和while循环:

for var in item1 item2 ... itemN
do
command1
command2
...
commandN
done

    写成一行就是:

for var in item1 item2 ... itemN; do command1; command2… done;

    下面来一个实例哈:

for loop in 1 2 3 4 5
do
echo "The value is: $loop"
done

    输出的结果就是:

The value is: 1
The value is: 2
The value is: 3
The value is: 4
The value is: 5

    for循环还可以顺序输出字符串来着:

for str in 'This is a string'
do
echo $str
done

    结果就是:

This is a string

    然后呢就是while循环的格式了:

while condition
do
command
done

    看一下实例哈(其中使用了let命令,它用于执行一个或者说多个表达式,变量计算中不需要加上$来表示变量):

#!/bin/sh
int=1
while(( $int<=5 ))
do
echo $int
let "int++"
done

    这就是结果输出:

1
2
3
4
5

    while呢,还可以用于读取键盘信息,下面这个实例中,输入信息设定为变量FILM,按下Ctrl+d键结束:

echo '按下 <CTRL-D> 退出'
echo -n '输入你最喜欢的网站名: '
while read FILM
do
echo "是的!$FILM 是一个好网站"
done

    输出的结果为:

按下 <CTRL-D> 退出
输入你最喜欢的网站名:朋恋冉曲
是的!朋恋冉曲 是一个好网站

    再来的话就是无限循环了:

while :
do
command
done

    或者嘞:

while true
do
command
done

    还有就是:

for (( ; ; ))

    然后呢就是until循环了:

    官方解释就是:


until循环执行一系列命令直至条件为真时停止。

until循环与while循环在处理方式上刚好相反。

一般while循环优于until循环,但在某些时候—也只是极少数情况下,until循环更加有用。

条件可为任意测试条件,测试发生在循环末尾,因此循环至少执行一次—请注意这一点。

语法格式就是:

until condition
do
command
done

    有了循环,我们当然要结束这个循环了,php中是break和continue,在shell中也是一样,接下来实例附上:

#!/bin/bash
while :
do
echo -n "输入 1 到 5 之间的数字:"
read aNum
case $aNum in
1|2|3|4|5) echo "你输入的数字为 $aNum!"
;;
*) echo "你输入的数字不是 1 到 5 之间的! 游戏结束"
break
;;
esac
done

    执行以上代码,输出的结果为:

输入 1 到 5 之间的数字:3
你输入的数字为 3!
输入 1 到 5 之间的数字:7
你输入的数字不是 1 到 5 之间的! 游戏结束

   

#!/bin/bash
while :
do
echo -n "输入 1 到 5 之间的数字: "
read aNum
case $aNum in
1|2|3|4|5) echo "你输入的数字为 $aNum!"
;;
*) echo "你输入的数字不是 1 到 5 之间的!"
continue
echo "游戏结束"
;;
esac
done

    运行代码你就会发现,当输入大于5的数字时,循环不会结束,语句echo "游戏结束"永远不会被执行。

    顺道再提一个case多选择语句,它可以用来匹配一个值或者一个模式,当匹配成功,会执行相应的代码,其格式为:

case 值 in
模式1)
command1
command2
...
commandN
;;
模式2)
command1
command2
...
commandN
;;
esac

    下面实例是提示输入一到四,于每一种模式进行匹配:

echo '输入 1 到 4 之间的数字:'
echo '你输入的数字为:'
read aNum
case $aNum in
1) echo '你选择了 1'
;;
2) echo '你选择了 2'
;;
3) echo '你选择了 3'
;;
4) echo '你选择了 4'
;;
*) echo '你没有输入 1 到 4 之间的数字'
;;

    运行上面的代码,随着输入的值的不同,会有不同的返回值,例如:

输入 1 到 4 之间的数字:
你输入的数字为:
3
你选择了 3

    好啦,今天的笔记就到这里了,以后的,会持续接上。。。

    再啰嗦一下,本人纯属小白自学,各位看官千万勿喷哈。。。

  原文链接:https://blog.csdn.net/luyaran/article/details/79360914

shell重温---基础篇(shell数组&数组操作)的更多相关文章

  1. shell重温---基础篇(参数传递&echo命令)

    经过前两天的学习,关于shell的基础算是知道的一般般啦,最起码不算是小白了(纯属意淫).今天就来点干货哈.   首先是运行shell脚本时的参数传递.脚本内获取参数的格式为$n.n代表了一个数字,例 ...

  2. shell重温---基础篇(shell变量&字符串以及git GUI运行shell脚本方式)

    既然是基础篇那肯定是需要对shell的各种需要注意的基本点进行说明了.接下来就是show time...    shell呢,是一个用C语言编写的应用程序,是用户使用linux的桥梁.所以呢,他既是一 ...

  3. shell重温---基础篇(函数操作)

        linux shell 可以用户定义函数,然后在shell脚本中可以随便调用.shell中函数的定义格式如下: [ function ] funname [()] { action; [ret ...

  4. shell重温---基础篇(连接数据库)

    前几天分享了shell字符串操作,数组操作等,接下来回归到项目,进行数据库操作.按照一般情况来说,shell连接数据库基本上都是DB使用的,因为需要运行大量的sql啊什么的,所以都会封装到shell中 ...

  5. shell重温---基础篇(流程控制&if判断&for&while&循环操作)

        和Java.PHP等语言不一样,sh的流程控制不可为空,如(以下为PHP流程控制写法): <?php if (isset($_GET["q"])) { search( ...

  6. shell重温---基础篇(文件包含)

        和其他语言一样,Shell 也可以包含外部脚本.这样可以很方便的封装一些公用的代码作为一个独立的文件.Shell 文件包含的语法格式如下: . filename # 注意点号(.)和文件名中间 ...

  7. shell重温---基础篇(printf命令&test命令)

    在shell中还有一个输出的命令,那就是printf了.它模仿的是C程序库(library)里的printf()程序,是由POSIX标准所定义,所以嘞,使用printf脚本比echo移植性要好一点,它 ...

  8. shell重温---基础篇(输入/输出重定向)

        大多数 UNIX 系统命令从你的终端接受输入并将所产生的输出发送回​​到您的终端.一个命令通常从一个叫标准输入的地方读取输入,默认情况下,这恰好是你的终端.同样,一个命令通常将其输出写入到标准 ...

  9. 【转】Shell编程基础篇-上

    [转]Shell编程基础篇-上 1.1 前言 1.1.1 为什么学Shell Shell脚本语言是实现Linux/UNIX系统管理及自动化运维所必备的重要工具, Linux/UNIX系统的底层及基础应 ...

随机推荐

  1. 在centos7中安装redis,并通过node.js操作redis

    引言 最近在学习node.js 连接redis的模块,所以尝试了一下在虚拟机中安装cent OS7,并安装redis,并使用node.js 操作redis.所以顺便做个笔记. 如有不对的地方,欢迎大家 ...

  2. Orchard Core 中文文档翻译(一)关于Orchard Core

    原文连接:https://www.cnblogs.com/Qbit/p/9746363.html 转载请注明出处 翻译说明:本系列为直译,按照官方的计划现在这个版本(2018年10月5日)已经接近最终 ...

  3. POJ 3070 矩阵快速幂

    题意:求菲波那切数列的第n项. 分析:矩阵快速幂. 右边的矩阵为a0 ,a1,,, 然后求乘一次,就进一位,求第n项,就是矩阵的n次方后,再乘以b矩阵后的第一行的第一列. #include <c ...

  4. [19/03/24-星期日] 容器_Collection(集合、容器)之List(表,有顺序可重复)

    一. 概念&方法 Collection 表示一组对象,它是集中.收集的意思.Collection接口的两个子接口是List.Set接口. 由于List.Set是Collection的子接口,意 ...

  5. 使用MSF生成木马_入侵Windows

    1>生成木马 (123.exe)        -f 输出格式 -o 输出地址 2>启动msfconsole 3>进行设置&&启动攻击 4>木马运行&后 ...

  6. XCode插件因为升级不能用了怎么办?几个步骤教你搞定

    之前XCode安装了自动注释的插件 VVDomenter.升级之后不能使用了怎么办?跟着我做吧. 1.打开xcode插件所在的目录:~/library/Application Support/Deve ...

  7. 【iOS】那些年,遇到的小坑

    'NSInvalidArgumentException', reason: '-[__NSPlaceholderDictionary initWithObjectsAndKeys:]: second ...

  8. SignalR中的依赖注入

    什么是依赖注入? 如果你已经熟悉依赖注入可以跳过此节. 依赖注入 (DI) 模式下,对象并不为自身的依赖负责. 下边的例子是一个主动 DI. 假设你有个对象需要消息日志.你可能定义了一个日志接口: C ...

  9. mysql数据去重复distinct、group by

    使用distinct 和group by都可以实现数据去重. select distinct 字段 group by 一般放在where条件后

  10. springboot缓存的使用

    spring针对各种缓存实现,抽象出了CacheManager接口,用户使用该接口处理缓存,而无需关心底层实现.并且也可以方便的更改缓存的具体实现,而不用修改业务代码.下面对于在springboot中 ...