2

我想将可变数量的“元组”作为参数传递到 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

4

2 回答 2

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
于 2013-07-02T19:50:27.080 回答
1

是的,这是可能的,而且有不止一种方法可以做到这一点。您可以对变量使用前缀/后缀扩展语法(例如${var#prefix}, ${var##prefix}, ${var%suffix}, ${var%%suffix}- 这些删除与指定模式匹配的最短或最长前缀/后缀)。或者您可以用 eg 替换位置参数IFS=, set -- ${var}(尽管您必须确保首先以某种方式保存其余的原始参数,以便您可以继续循环)。你可以使用数组,如果你的版本bash足够新(如果它不是很旧......)。这些可能是三种更好的方法,但还有其他方法......

编辑:使用后缀/前缀扩展的一些示例:

for tuple in first_file.xls,1
do
  echo ${tuple%,*}     # "first_file.xls"
  echo ${tuple#*,}     # "1"
done

如果您的元组超过 2 元,则该方法会稍微复杂一些;例如:

for tuple in x,y,z
do
  first=${tuple%%,*}
  rest=${tuple#${first}}
  second=${rest%%,*}
  last=${rest#*,}
done

在这种情况下,您可能更喜欢@chepner 的回答IFS=, read first second third <<< "${tuple}"……否则,对于大型元组,簿记可能会变得很麻烦。从元组中设置一个数组也是一种可接受的选择。

不过,对于简单的配对,我倾向于只酌情剥离前缀/后缀......

于 2013-07-02T19:53:34.533 回答