0

我有一个名为 bundle 的脚本,它使用 Here-documents 将文本文件组合成一个文件。这些文件,其名称在调用捆绑脚本时作为参数传递,被放置在单个文件中(此处命名为 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

我的问题如下:我必须重写捆绑脚本,以便可以使用或不使用文件名作为参数来执行由此产生的 filebundle 文件,并且可以相应地解开其中包含的文件。

例如:

$ bash filebundle file2.txt

只会解绑 file2.txt 而不是 file1.txt。此外,不带参数抨击 filebundle 将解开 filebundle 中的所有文件。

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

for i in $@; do
    grep "$i" <<'End of $i' | bash
done

在 filebundle 中查找特定文件并解绑它们。然而,我似乎无法将这些组合在一起成为有效的东西。

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

4

1 回答 1

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
}

只有在没有参数或文件名在其中时,每个文件才会被解绑。

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

于 2013-07-02T23:35:44.927 回答