bash:通过连接N个字符串来创建变量,其中N是脚本参数

时间:2014-02-07 05:50:25

标签: linux bash shell sed awk

假设我有一个bash脚本myscript.sh,它将2个数字N和P作为参数 - 即,我会像这样运行它:sh myscript.sh 3 4

在脚本中,我想运行一个以逗号分隔文件列表作为参数的程序。 N表示该列表中的元素数。我需要构建这个文件路径列表,区别为从1到N的样本号。通过示例更容易看到:

#!/bin/sh

myProgram -p $1 -f /home/folder/sample01.R,/home/folder/sample02.R,/home/folder/sample03.R 

我正在努力创建仅以N(3)为输入的逗号分隔文件列表。有没有一种很好的方法来创建一个包含字符串/home/folder/sample01.R,/home/folder/sample02.R,/home/folder/sample03.R的变量作为3的函数?

我已成功使用01,02,03创建一个保留seq的变量,但无法弄清楚如何将文件路径附加到这些数字。 (由于在变量评估之前支撑扩展发生这一事实,我陷入困境 - 因此,设置X = 'seq -f %02.0f 1 $N'并且执行a{$X}b 而不是会给{{1}正如我所希望的那样,即使它确实如此,我也不确定如何从中产生a01b a02b a03b。)。另一个障碍是我没有使用bash 4,所以a01b,a02b,a03b给出了一系列非零填充的数字(导致问题)。我使用Python开发了一种解决方法,但我希望能够在bash中完成它以避免调用外部脚本。

赞赏所有建议!

2 个答案:

答案 0 :(得分:1)

您可以使用数字N构建字符串,如下所示:

N=3
s=""
for ((n=1; n<=N; n++)); do
    [[ -n "$s" ]] && s="$s,"
    printf -v s "%s/home/folder/sample%02d.R" "$s" "$n"
done

echo "$s"
/home/folder/sample01.R,/home/folder/sample02.R,/home/folder/sample03.R

答案 1 :(得分:0)

如果我是你,我会看一下内置的printf

f=$(printf "/home/folder/sample%02d.R" $num) 

如果你把它放在一个循环中,你将得到正确格式化的数字。

要创建以逗号分隔的列表,您只需将每个文件名附加到带逗号的字符串:

files="$files, $f"

在循环之后,你只需要从字符串中删除第一个字符(它是一个多余的逗号),然后你就完成了。