Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays shell脚本中的递归解析和数组_Arrays_Bash_Shell - Fatal编程技术网

Arrays 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,使用该数组调用另一个脚

我打算为shell脚本
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_l1。如果需要密钥列表,请使用
${!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: