我想将一个可变数量的'元组'作为参数传递给bash脚本,并使用模式匹配在循环中完成它们,如下所示:
for *,* in "$@"; do
#do something with first part of tuple
#do something with second part of tuple
done
这可能吗?如果是这样,我如何访问元组的每个部分?
例如,我想把我的脚本称为:
bash bashscript.sh first_file.xls,1 second_file,2 third_file,2 ... nth_file,1
答案 0 :(得分:5)
由于bash
没有元组数据类型(它只有字符串),您需要自己编码和解码它们。例如:
$ bash bashscript.sh first_file.xls,1 second_file,2 third_file,2 ... nth_file,1
在bashscript.sh
:
for tuple in "$@"; do
IFS=, read first second <<< "$tuple"
...
done
答案 1 :(得分:1)
是的,这是可能的,并且有多种方法可以做到这一点。您可以对变量使用前缀/后缀扩展语法(例如${var#prefix}
,${var##prefix}
,${var%suffix}
,${var%%suffix}
- 这些删除与指定匹配的最短或最长前缀/后缀图案)。或者你可以用例如替换位置参数。 IFS=, set -- ${var}
(尽管您必须先确保以某种方式保存其余的原始参数,以便继续循环)。如果你的bash
版本足够新(并且它不是很老了......),你可以使用数组。这些可能是三种更好的方法,但还有其他方法......
编辑:使用后缀/前缀扩展的一些示例:
for tuple in first_file.xls,1
do
echo ${tuple%,*} # "first_file.xls"
echo ${tuple#*,} # "1"
done
如果你的元组超过2-ary,那么这种方法会更复杂一些;例如:
for tuple in x,y,z
do
first=${tuple%%,*}
rest=${tuple#${first}}
second=${rest%%,*}
last=${rest#*,}
done
在这种情况下,您可能更喜欢@Chepner对IFS=, read first second third <<< "${tuple}"
的回答...否则,对于大元组,簿记会变得毛茸茸。从元组设置数组也是一种可接受的替代方案。
但是,对于简单的对,我倾向于只是根据需要剥离前缀/后缀...