我打算为我的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
中进行解析。在这里
-
和,
,或者根本没有。-
和,
,请获取-
之后的值,并将其作为参数传递给另一个脚本(例如a
{{1} }作为单独的参数传递给另一个脚本。e,f
和-
,只需运行另一个没有参数的脚本(例如,对于,
,运行另一个没有参数的脚本)。我该怎么做?
更新:
我设法找到一种方法:
d
答案 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_l2包含了您需要的所有内容,而不必以后再引用list_l1。如果需要键列表,请使用${!list_l2[@]}
。如果需要值列表,请使用${list_l2[@]}
。
让我知道这是否满足您的要求。