bash中的模式匹配与类似元组的参数

时间:2013-07-02 19:46:00

标签: bash

我想将一个可变数量的'元组'作为参数传递给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

2 个答案:

答案 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}"的回答...否则,对于大元组,簿记会变得毛茸茸。从元组设置数组也是一种可接受的替代方案。

但是,对于简单的对,我倾向于只是根据需要剥离前缀/后缀...