我有一个名为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中查找特定文件并解开它们。然而,我似乎无法将这些结合在一起起作用。
非常感谢您的想法和建议。
答案 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
}
如果没有参数,或者文件名在其中,则每个文件只会被解除捆绑。
您可以在标头中添加其他逻辑,以确保在开始运行这些块之前文件中存在指定的所有文件名。