Bash:在脚本中搜索一个命令块,然后执行这些命令

时间:2013-07-02 22:51:31

标签: bash arguments heredoc control-structure

我有一个名为bundle的脚本,它使用Here-documents将文本文件合并到一个文件中。这些文件的名称在调用bundle脚本时作为参数传递,放在一个文件中(此处名为filebundle),然后可以作为bash脚本执行,将文件解包回单独的文件中。

这是捆绑脚本:

#! /bin/bash
# bundle: group files into distribution package.

echo "# To unbundle, bash this file."

for i
do 
    echo "echo $i 1>&2"
    echo "cat >$i <<'End of $i'"
    cat $i
    echo "End of $i"
done

执行时如下

$ bash bundle file1.txt file2.txt > filebundle

产生以下文件,名为filebundle:

# To unbundle, bash this file.
echo file1.txt 1>&2
cat >file1.txt <<'End of file1.txt'
This is file1.
End of file1.txt
echo file2.txt 1>&2
cat >file2.txt <<'End of file2.txt'
This is file2.
End of file2.txt

正如我所说的那样,可以用来解压缩file1.txt和file2.txt

我的问题如下:我必须重写bundle脚本,以便可以使用或不使用filenames作为参数执行由它生成的filebundle文件,并可以相应地解包其中包含的文件。

例如:

$ bash filebundle file2.txt

只能解开file2.txt而不是file1.txt。另外,不带参数的bashing filebundle会解压缩filebundle中的所有文件。

我假设我应该使用“if ... then ... else”控制结构根据传递的参数解开文件,我只能想到使用像

这样的东西
for i in $@; do
    grep "$i" <<'End of $i' | bash
done

在filebundle中查找特定文件并解开它们。然而,我似乎无法将这些结合在一起起作用。

非常感谢您的想法和建议。

1 个答案:

答案 0 :(得分:0)

解包时,您无需查找特定文件。 if..then处理这个问题。

使文件包成为一组这样的块:

if [[ $# = 0 ]] || contains "file1.txt" "$@"
then
cat > file1.txt  << 'End of file1.txt'
DATA HERE
End of file1.txt
fi

其中contains是一个检查其余元素的函数,例如

contains() { 
    var=$1
    shift
    for f
    do 
        [[ $var = "$f" ]] && return 0
    done
    return 1
}

如果没有参数,或者文件名在其中,则每个文件只会被解除捆绑。

您可以在标头中添加其他逻辑,以确保在开始运行这些块之前文件中存在指定的所有文件名。