# Outputting a standalone shell script from arguments

I am solving an exercise. Essentially, it's a shell script that takes in file and/or directory arguments and outputs another (standalone) shell script that outputs these files, including any directory structure associated with them.

Example usage:

bundle.sh dir1 dir2 file1 file2 file3 >unpack.sh


This expects that bundle.sh can be found in the PATH environment variable. If not, just run it like this:

pwd/bundle.sh dir file1 file2 >unpack.sh


Running unpack.sh should recreate everything.

Accepted limitations:

• Only works for textual files
• Files may not contain the line End of filename

Solution:

echo "# Run to unpack"
for i; do
(cd $i 2>/dev/null && echo "mkdir$i && cd $i" &&$0 * &&
echo cd ..)
cd $i 2>/dev/null || ( echo echo ls -l$i
echo "cat >$i <<'End of$i'"
cat $i echo End of$i)
done


This is my solution for exercises 3-17 and 3-18 in the Unix Programming Environment by Brian W. Kernighan and Rob Pike. It works but I would appreciate any feedback. I will mention that the book has not yet covered conditional statements, globbing, etc. So I am trying to stick to what I've learned so far for now and might come back to it later.

One thing that I realize is that this doesn't deal with names that contain spaces. I have tried putting \"s around most $is (except for the ones in the echos, where it shouldn't matter) but that seems to make things worse. The other two is that I find my usage of cd to test for directories kind of a hack and the fact that I am not sure I am handling $0 correctly, which is why I made explicit requirements on how to run bundle.sh (maybe there is some way to make it better?). However, I am not interested in just these issues, I want feedback in general given my requirements and constraints. Even advice regarding to style may be valuable to me.