Arrays shell脚本中的递归解析和数组
我打算为shell脚本Arrays shell脚本中的递归解析和数组,arrays,bash,shell,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 根据我对您问题的理解,我生成了以下代码: **编辑no1,使用该数组调用另一个脚
my_script.sh
接受一个参数,并使用分隔符解析其中的值。比如说,
./my_script.sh a-e,f/b-1/c-5,g/d
表示我的主分离器为/
,次分离器为-
,三级分离器为,
。这里的挑战是由、
或-
分隔的值的数量不是固定的,而是可变的。就像在d
中一样,根本没有-
或,
。我总是可以将/
分隔的值解析为:
IFS='/' read -ra list_l1 <<<$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
一些细节:
- 第一步是在“/”上剪切。这将创建列表
- 列表中的所有元素都以['a','b','c','d',…]开头。在“/”上剪切后每个元素的第一个字母
- 然后每一个都在“-”上进行第二次切割
- 该剪切的第一部分(“-”的左侧)成为关键点
- 该切割的第二部分(“-”的右侧)成为值
- list_l2使用刚刚计算的键和值创建为关联数组
${!list_l2[@]}
。如果需要值列表,请使用${list_l2[@]}
让我知道这是否符合您的要求。请查看以下内容:
#!/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
这里的递归解析是什么意思?意思是在一个字符串中使用多个分隔符进行解析。这是误导吗?请添加以下内容:从你的示例参数(a-e、f/b-1/c-5、g/d)开始,依次显示你想做的每个切割。例如,由
/
开头。所以它变成(a-e,f)(b-1)(c-5,g)(d)。然后,根据这些切割,列表l1、列表l2、列表l3中会出现什么。除此之外,您知道,如果使用bash中其他脚本/应用程序使用的相同参数模式,您的生活将大大简化?@Nic3500我在我认为是下一级解析的部分中添加了一个伪代码。进入哪个列表的规则不清楚(正如您从评论中看到的,我不是唯一一个)。看一看,我很抱歉把它弄得模棱两可。值e
,f
不是同一字符串的一部分。我需要它们作为单独的值。在这里,我可以看到您的解决方案是连接它们。您将如何将它们分开?list_l2的可接受内容是什么?我基本上希望e
和f
存储在一个数组中,并将它们作为参数传递给另一个脚本,比如说,exec./other_script.sh${parameter[I]}
基于伪代码中的类型。因此list_l2=[e][f][1][5][g],没有a、b、c、d键?是的。当外部for循环根据分隔符/
在数组元素上写入循环时,在该循环中,我需要检查该特定数组元素中-
之前和之后的内容,并基于此,我需要将它们作为(多个或单个或否)传递另一个脚本.sh
的参数。这与我的想法类似,但我可以看到它将参数e
,f
作为一个字符串传递给另一个脚本,而我希望它们以数组的形式传递。当我检查othera_script.sh
中接收的参数数量时,它显示1而不是2。不可能以/other_script.sh c[0]c[1]
而不是$*
的身份传递吗?@skrowten\u hermit Hm,我不太清楚。但是我使用“$*”
只是为了打印所有传递的参数(演示目的),您可以使用“$@”
或者$1
等等。我理解这一点。/other_script.sh“${c[@]}”
是传递参数的有效傻瓜式方法吗?@skrowten\u hermit是的<代码>“$@”
正确地扩展为单独的单词,相当于:“$1”“$2”
等;)
$ ./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
#!/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
$ ./script
I am called with 2 arguments: e f
I am called with 1 arguments: 1
I am called with 2 arguments: 5 g
I am called with 0 arguments: