Shell脚本中的递归解析和数组

时间:2018-09-07 10:04:09

标签: arrays bash shell

我打算为我的shell脚本my_script.sh接受一个参数,并使用分隔符从中解析值。例如,

./my_script.sh a-e,f/b-1/c-5,g/d

表示我的主分隔符是/,辅助分隔符是-,三级分隔符是,。这里的挑战是由,-分隔的值的数量不是固定的,而是可变的。像d中一样,根本没有-,。我总是可以将/分隔的值解析为:

IFS='/' read -ra list_l1 <<<$1

这样,我得到了需要循环的次数。但是我坚持尝试在list_l1中进行解析。在这里

  1. 我需要查看是否有-,,或者根本没有。
  2. 如果存在-,,请获取-之后的值,并将其作为参数传递给另一个脚本(例如a {{1} }作为单独的参数传递给另一个脚本。
  3. 如果没有e,f-,只需运行另一个没有参数的脚本(例如,对于,,运行另一个没有参数的脚本)。

我该怎么做?

更新:

我设法找到一种方法:

d

2 个答案:

答案 0 :(得分:2)

看看这个:

[Route("Test")]
    public ActionResult GetTestData()
    {
        return Ok(new { value1="value1",value2="value2" });
    }
#!/usr/bin/env bash

f() { printf 'I am called with %d arguments: %s\n' "$#" "$*"; }

param='a-e,f/b-1/c-5,g/d'

IFS=/ read -ra a <<< "$param"
for i in "${a[@]}"; do
    IFS=- read -r _ b <<< "$i"
    IFS=, read -ra c <<< "$b"
    f "${c[@]}"    
done

答案 1 :(得分:1)

根据我对您的问题的了解,我编写了以下代码: **编辑no1,使用该数组调用另一个脚本**

#!/bin/bash

arg='a-e,f/b-1/c-5,g/d'

# Cuts it in [a-e,f] [b-1] [c5,g] [d]
IFS='//' read -ra list_l1 <<<$arg

echo "First cut on /."
echo "Content of list_l1"
for K in "${!list_l1[@]}"
do
    echo "list_l1[$K]: ${list_l1[$K]}"
done
echo ""

declare -A list_l2
echo "Then loop, cut on '-' and replace ',' by ' '."
for onearg in ${list_l1[@]}
do
    IFS='-' read part1 part2 <<<$onearg

    list_l2[$part1]=$(echo $part2 | tr ',' ' ')
done

echo "Content of list_l2:"
for K in "${!list_l2[@]}"
do
    echo "list_l2[$K]: ${list_l2[$K]}"
done

# Calling another script using these values
echo ""
for K in "${!list_l2[@]}"
do
    echo "./another_script.sh ${list_l2[$K]}"
done

哪个给出以下输出:

$ ./t.bash 
First cut on /.
Content of list_l1
list_l1[0]: a-e,f
list_l1[1]: b-1
list_l1[2]: c-5,g
list_l1[3]: d

Then loop, cut on '-' and replace ',' by ' '.
Content of list_l2:
list_l2[a]: e f
list_l2[b]: 1
list_l2[c]: 5 g
list_l2[d]: 

./another_script.sh e f
./another_script.sh 1
./another_script.sh 5 g
./another_script.sh 

一些细节:

  • 第一步是切入“ /”。这将创建list_l1。
  • list_l1中的所有元素均以['a','b','c','d',...]开头。剪切到“ /”之后,每个元素的第一个字母。
  • 然后在“-”上第二次剪切它们。
  • 该切口的第一部分(“-”的左侧)成为关键。
  • 该切割的第二部分(“-”的右侧)成为值。
  • list_l2使用刚刚计算的键和值作为关联数组创建。

这种方式list_l2包含了您需要的所有内容,而不必以后再引用list_l1。如果需要键列表,请使用${!list_l2[@]}。如果需要值列表,请使用${list_l2[@]}

让我知道这是否满足您的要求。