Bash:在列表上迭代模式匹配,忽略第二个和后续匹配

问题描述 投票:0回答:0

我想:

  1. 遍历列表;
  2. 找到第一个有匹配子串的实例;
  3. 为此做点什么;
  4. 忽略任何后续匹配。
  5. 继续到列表的末尾。

更具体地说:

#! /bin/bash

target_ORG=$(ls /usr/local/etc/ini/system/ORG)
target_DOMAIN=$(ls /usr/local/etc/ini/system/DOMAIN)
target_SITE=$(ls /usr/local/etc/ini/system/SITE)
target_DEVICE=$(ls /usr/local/etc/ini/system/DEVICE)
target_VOLUME=$(ls /usr/local/etc/ini/system/VOLUME)
target_HOST=$(ls /usr/local/etc/ini/system/HOST)


instanceList=$(ls /dev/disk/by-partlabel)

for i in $instanceList 
 
  do
    instance_ORG=${i:0:3}
    instance_DOMAIN=${i:4:3}
    instance_SAN=${i:8:1}
    instance_SITE=${i:10:1}
    instance_DEVICE=${i:12:5}
    instance_VOLUME=${i:18:6}
    
    <PSEUDOCODE>
   
    Compare the instance_* strings with the target_* strings
    IF they all match
       THEN
           mount $i /path/to/mountpoint

    </PSEUDOCODE>

  done

地点:

  1. 可用的具体设备随时间变化

  2. partlabel格式为:xxx-xxx-x-x-xxxxx-xxxxxx(如001-001-1-1-00001-000001),表示一个磁盘分区为ORG-DOMAIN-SAN-SITE-DEVICE-VOLUME

  3. /usr/local/etc/ini/system/* 目录每个包含一个以相应子字符串命名的文件 - 允许通过简单地重命名(而不是必须操作文件的内容)来进行更改

  4. /path/to/mountpoint 是匹配的 $instance_SAN 的挂载点 - 即 ...

xxx-xxx-1-x-xxxxx-xxxxxx 安装到 /path/to/1
xxx-xxx-2-x-xxxxx-xxxxxx 挂载到 /path/to/2
xxx-xxx-3-x-xxxxx-xxxxxx 安装到 /path/to/3


for 循环的问题在于,当我希望它保留第一个找到的实例时,它只会将下一个值分配给 $instance_* 变量 - 所以,xxx-xxx-1-1-xxxxx -xxxxxx 将被 xxx-xxx-1-2-xxxxx-xxxxxx 等覆盖。


A case 测试将找到并保留第一个找到的实例,但不会迭代其余的 $instanceList

例如给予

/usr/local/etc/init/system/ORG/001
/usr/local/etc/init/system/DOMAIN/001
/usr/local/etc/init/system/SITE/1
/usr/local/etc/init/system/DEVICE/00001
/usr/local/etc/init/system/VOLUME/000001
/usr/local/etc/init/system/HOST/000001

...和...

$instanceList 的:

001-001-1-1-00001-000001
001-001-1-1-00001-000002
001-001-1-2-00001-000001
001-001-1-2-00001-000002
001-001-2-2-00001-000001
001-001-2-2-00002-000001
001-001-3-5-00001-000002

001-001-1-1-00001-000001 将挂载到 /path/to/1,其他所有内容都将被忽略。



我需要挂载第一个匹配设备并忽略任何其他具有匹配 $instance_SAN 的设备,同时继续遍历 $instanceList。

例如鉴于以上


001-001-1-1-00001-000001 应该安装到 /path/to/1
001-001-1-1-00001-000002 应该被忽略
001-001-1-2-00001-000001 应该被忽略
001-001-1-2-00001-000002 应该被忽略
001-001-2-2-00001-000001 应该安装到 /path/to/2
001-001-2-2-00002-000001 应该被忽略
001-001-3-5-00001-000002 应该安装到 /path/to/3


嵌套 if 测试太脆弱。

多个case测试可以工作

<PSEUDOCODE>
 
Case of $instance_SAN=1: mount device/partion to /path/to/$instance_SAN
Case of $instance_SAN=2: mount device/partion to /path/to/$instance_SAN
Case of $instance_SAN=3: mount device/partion to /path/to/$instance_SAN

</PSEUDOCODE>

但我无法全神贯注地思考如何遍历 $instanceList 而不是在第一场比赛后简单地中断。

我意识到这可能是非常基本的,但恐怕我的 bash 不是很高级。

但是,我想避免使用诸如 autoFS 之类的解决方案,因此该方法只依赖于核心 Linux 安装;即使是像最小的 Arch/Gentoo,甚至 LFS 这样的东西,也应该能够在不需要任何额外实用程序的情况下提供所有东西——而且,这必须在登录前完成,所以,我不认为“第三方”解决方案无论如何都会起作用。

bash loops testing conditional-statements matching
© www.soinside.com 2019 - 2024. All rights reserved.