掌握shell编程中数组的常见用法及示例

From: http://www.embeddedlinux.org.cn/html/jishuzixun/201211/19-2386.html

给大家分享下数组的用法小例子,希望能给大家一点帮助。其实SHELL的数组很简单,好用。我们学习都应该遵循简单、易用的原则。

shell编程中数组的简单用法及示例

    新版本的Bash支持一维数组. 数组元素可以使用符号variable[xx]等方式来初始化. 另外, 脚本可以使用declare -a variable语句来指定一个数组等。要引用一个数组元素(也就是取值), 可以使用大括号, 访问形式为${variable[xx]},当然了,下面是一些老男孩经常使用的方法和对数组的一点理解,如有高见,欢迎指导,先谢谢博友们了。

1.1 shell数组的常用定义方法:
1)方法一:
命令法:
dir=($(ls .))

范例1:手工命令行操作演示
[root@oldboy scripts]# dir=($(ls .))
[root@oldboy scripts]# ls .
oldboy.log  apachemon.sh  httpdctl

[root@oldboy scripts]# echo ${#dir[*]} <==查看数组的长度
3

命令行循环打印数组元素:
写法1:
for ((i=0; i<`echo ${#dir[*]}`; i++))
do
echo -e "${dir[$i]}\n"
done
提示:i<`echo ${#dir[*]}`可以用更简单的写法i<${#dir[*]}替换,(感谢永夜兄弟)。
====================================
写法2:
for ((i=0; i<${#dir[*]}; i++))
do
echo -e "${dir[$i]}\n"
done
====================================
写法3:
for((i=0;i<${#dir[@]};i++))
do
echo ${dir[${i}]}
done

范例2:通过脚本定义及输出数组元素:
[root@oldboy scripts]# cat printarray.sh
dir=($(ls .))
for ((i=0; i<${#dir[*]}; i++))
do
   echo -e "${dir[$i]}\n"
done

[root@oldboy scripts]# sh printarray.sh 
oldboy.log

apachemon.sh

httpdctl

printarray.sh
====================================================
2)方法二:列举元素法
array=(red green blue yellow magenta)
array=(
 oldboy
 zhangyue
 zhangyang
)
范例3:列举元素法的脚本例子
[root@oldboy ~# cat test.sh
array=(
oldboy
zhangyue
zhangyang
)

for ((i=0; i< ${#array[*]}; i++))
do
   echo "${array[$i]}"
done
echo ----------------------
echo "array len:${#array[*]}"
[root@oldboy ~# sh test.sh
oldboy
zhangyue
zhangyang
array len:3

3)方法3:其实方法三和方法一一样,因具有很好的实战价值因此单独列出讲解
judge=($(curl -I -s ${url_list[$i]}|head -1|tr "\r" "\n"))

范例4:比较专业的生产检查URL地址的脚本(shell数组方法):
[root@oldboy ~]# cat check_url.sh
#!/bin/bash
# this script is created by oldboy.
# e_mail:31333741@qq.com
# qqinfo:49000448
# function:check web url
# version:1.1
. /etc/init.d/functions

url_list=(
http://)

function wait()
{
echo -n '3秒后,执行该操作.';
for ((i=0;i<3;i++))
do
  echo -n ".";sleep 1
done
echo
}
function check_url()
{
wait
echo 'check url...'
for ((i=0; i<${#url_list[*]}; i++))
do
# HTTP/1.1 200 OK
judge=($(curl -I -s ${url_list[$i]}|head -1|tr "\r" "\n"))
if [[ "${judge[1]}" == '200' && "${judge[2]}"=='OK' ]]
   then
   action "${url_list[$i]}" /bin/true
else
   action "${url_list[$i]}" /bin/false
fi
done
}
check_url
[root@oldboy ~]# sh check_url.sh 
3秒后,执行该操作....
check url...

提示:上述结果是带颜色的。

范例5:实现lvs负载均衡健康检查及自动剔除和自动加入RS的脚本(多年前的脚本)
[root@oldboy sbin]# cat health_check_url.sh     
#!/bin/bash
# this script is created by oldboy.
# e_mail:31333741@qq.com
# qqinfo:31333741
# function:
# version:1.1
PORT="80"
VIP=192.168.1.181
RIP=(
    192.168.1.178
    192.168.1.179
)
function check_url()
{
for ((i=0; i< ${#RIP[*]}; i++))
do
judge=($(curl -I -s http://${RIP[$i]}|head -1|tr "\r" "\n"))
if [[ "${judge[1]}" == '200' && "${judge[2]}"=='OK' ]]
   then
     if [ `ipvsadm -L -n|grep "${RIP[$i]}"|wc -l` -ne 1 ]
      then
      ipvsadm -a -t $VIP:$PORT -r ${RIP[$i]}:$PORT
     fi
 
else
      if [ `ipvsadm -L -n|grep "${RIP[$i]}"|wc -l` -eq 1 ]
      then
      ipvsadm -d -t $VIP:$PORT -r ${RIP[$i]}:$PORT
      fi
fi
done
}
 
while true
do
 check_url
 sleep 5
done
---------------------------------------------------------
1.2 阅读博文后可以练习的小例子
问题1: 把1-3 3个数字存到数组里 分别乘以8 然后依次输出。
解答:
下面的评论里已有正确答案,有兴趣的朋友可以先思考写写,然后看评论,如果有问题欢迎评论提问,如果力所能及老男孩愿意为你解答疑惑。

问题2:一个SHELL脚本:oldboy.sh内容为定义一个数组array=(1 2 3)
要打印数组元素的个数。
要求:要把数组array当作变量在执行脚本时传参到脚本里使用(这块是本题的难点)
例如:这样执行 sh oldboy.sh array

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

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

相关文章

QT tr与Qstring的差别

在论坛中漂&#xff0c;经常遇到有人遇到tr相关的问题。用tr的有两类人&#xff1a; (1)因为发现中文老出问题&#xff0c;然后搜索&#xff0c;发现很多人用tr&#xff0c;于是他也开始用tr(2)另一类人&#xff0c;确实是出于国际化的需要&#xff0c;将需要在界面上显示的文…

printf的扩展

#define printf(format , ...) printf("FILE[%s] LINE[%d]" format , __FILE__ , __LINE__ , ##__VA_ARGS__)这个宏应用好几个技巧&#xff1a;1、使用printf宏&#xff0c;和原来的printf相同。这样我们不需要修改源码&#xff0c;直接替换原来的printf的函数。2、…

[react] contextType是什么?它有什么用?

[react] contextType是什么&#xff1f;它有什么用&#xff1f; 定义当前组件要使用哪一个context const MyContext React.createContext(defaultValue);class MyClass extends React.Component {componentDidMount() {let value this.context;/* perform a side-effect at…

shell 基本知识

shell--脚本基础知识 ****shell 脚本基础知识**** 一、基本脚本编译 知识内容&#xff1a; # 构建脚本 # 将命令串联起来 # 存储变量 # 数学计算 # 重定向输出 # 检查代码shell不像高级语言需要编译后执行&#xff0c;而是直接处理每一条命令&#xff0c;可以将多条命令连接起来…

Lombok(1.14.8) - @Log

Log Logs&#xff0c;生成一个日志对象。 package com.huey.lombok;import lombok.extern.java.Log;Log public class LogExample {public static void main(String[] args) {log.info("This is an info message."); }} 除了&#xff0c;Log还有其他annotatio…

让LwIP拥有PING其他设备的能力

LwIP是个很不错的协议栈&#xff0c;但是由于其体积过于小巧&#xff0c;使其只能支持ICMP的ECHO类型。 因为在“icmp.c”中的“void icmp_input(struct pbuf *p, struct netif *inp)”函数里有个很长的switch case语句&#xff08;大约80行的位置&#xff09;。 而这个语句只…

[react] 在React怎么使用Context?

[react] 在React怎么使用Context&#xff1f; context : Context提供了一种方式&#xff0c;能够让数据在组件树中传递&#xff0c;而不必一级一级手动传递。 API : createContext(defaultValue?)。 使用方法&#xff1a; 首先要引入createContext import React, { Component…

H.264详解

From: http://netliuwei.blog.163.com/blog/static/93642191201111721931583/ H.264 H.264&#xff0c;同时也是MPEG-4第十部分&#xff0c;是由ITU-T视频编码专家组&#xff08;VCEG&#xff09;和ISO/IEC动态图像专家组&#xff08;MPEG&#xff09;联合组成的联合视频组&…

使用UDP

基本UDP客户端 #!/usr/bin/env python # UDP Example - Chapter 2 import socket, sys, time host sys.argv[1] textport sys.argv[2] s socket.socket(socket.AF_INET, socket.SOCK_DGRAM) try: port int(textport) except ValueError: # That didnt work. Look it up in…

QT中的MessageBox设置自动关闭退出

一、概述 由于弹出的MessageBox需要手动操作&#xff0c;点击相关操作程序才会进一步执行&#xff0c;所以有时程序使用了MessageBox会阻塞相关功能代码执行。例如&#xff0c;在串口编程中&#xff0c;接收到数据或某项配置成功后弹出一个MessageBox&#xff0c;由于没有及时…

(剑指Offer)面试题54:表示数值的字符串

题目&#xff1a; 请实现一个函数用来判断字符串是否表示数值&#xff08;包括整数和小数&#xff09;。例如&#xff0c;字符串"100","5e2","-123","3.1416"和"-1E-16"都表示数值。 但是"12e","1a3.14"…

Loopback Address

ping 127.0.0.1 是你本地的回环地址&#xff01; 实际上只要是127.0.0.1到127.255.255.255都是回环地址&#xff01;都是可以PING检查的&#xff01; 它能ping通&#xff0c;说明你的TCP/IP协议栈没问题&#xff01;如果有问题&#xff0c;你就得检查TCP/IP协议栈&#xff0c;或…

[react] Consumer向上找不到Provider的时候怎么办?

[react] Consumer向上找不到Provider的时候怎么办&#xff1f; 当consumer向上层找不到provider时&#xff0c;此时就会取创建context时传给createContext的那个值&#xff0c;也就是当前context对象的默认值&#xff0c;在定义provider时的value中的值不是默认值&#xff0c;…

VSCode中配置prettier和ESLint

文章目录 了解ESLint和Prettier的作用prettier配置ESLint配置常见问答ESLint 和Prettier 有什么区别&#xff1f;为什么我应该同时使用ESLint 和Prettier&#xff1f;在使用ESLint 和Prettier 时&#xff0c;有可能出现它们之间的规则冲突吗&#xff1f;我已经在项目中使用了ES…

赵丽词汇速记5500幻星笔记 (0、1)

赵丽词汇速记<5500>幻星笔记00-1开场白自我介绍http://teacherzhaoli.nease.net/上课要求:需要准备一个笔记本able adj.enable v.ability n.如何记笔记&#xff1a;把笔记打成三格单词中文助记方法搜索引擎&#xff1a;赵丽词汇词汇重要性词汇当先1.阅读离不开单…

matlab 数据是否符合正态分布的判断方法

一、问题描述 给定序列X(x1,x2,x3,...,xn)&#xff0c;判断是否该数据序列X符合正态分布。 二、方法 常见已知分布的检验方法&#xff1a;kstest、jbtest、lillietest、chi2gof等&#xff0c;这里使用使用Lilliefors检验进行描述。 语法&#xff1a; 1&#xff1a;h lillie…

什么是CIF/4CIF/QCIF/D1?

From: http://www.c-ps.net/trade/content/2008/8/8009.html QCIF全称Quarter common intermediate format。QCIF是常用的标准化图像格式。在H.323协议簇中&#xff0c;规定了视频采集设备的标准采集分辨率。QCIF 176144像素。 CIF是常用的标准化图像格式&#xff08;Commo…

字符串string和内存流MemoryStream及比特数组byte[]互转

定义string变量为str,内存流变量为ms,比特数组为bt 1.字符串转比特数组 (1)byte[] btSystem.Text.Encoding.Default.GetBytes("字符串"); (2)byte[] btConvert.FromBase64String("字符串"); 2.字符串转流 (1)MemoryStream msnew MemoryStream(System.Text.…

Lwip使用经验

LWIP使用经验 一 LWIP内存管理 数据包管理 设置内存大小 宏编译开关 二 LWIP启动时序 三 LWIP运行逻辑 接收数据包 SequentialAPI函数调用 四 TCPIP核心知识点 滑动窗口 三次握手 断开连接 TCP状态转换 同时打开 同时关闭 五正确使用LWIP 六 LWIP常见问题 网卡驱动程序 内存…

Keil5 编译生成bin二进制文件的设置方法

勾选&#xff1a;After Build/Rebuild Run #1 代码&#xff1a;fromelf --bin .\output\node.axf --output .\output\NoiseApp.bin 解释&#xff1a; .\ 指当前工程文件.uvprojx所在的目录.\output\node.axf 表示给定axf所在的位置.\output\NoiseApp.bin 表示bin文件输出的…