I need to generate a script from within a script but am having problems because some of the commands going into the new script are being interpreted rather than written to the new file. For example i want to create a file called start.sh in it I want to set a variable to the current IP address:
echo "localip=$(ip addr | grep 'state UP' -A2 | tail -n1 | awk '{print $2}' | cut -f1 -d'/')" > /start.sh
what gets written to the file is:
localip=192.168.1.78
But what i wanted was the following text in the new file:
localip=$(ip addr | grep 'state UP' -A2 | tail -n1 | awk '{print $2}' | cut -f1 -d'/')"
so that the IP is determined when the generated script is run.
What am i doing wrong ?
You're making this unnecessary hard. Use a heredoc with a quoted sigil to pass literal contents through without any kind of expansion:
Using
<<'EOF'
or<<\EOF
, as opposed to just<<EOF
, is essential; the latter will perform expansion just as your original code does.If anything you're writing to
start.sh
needs to be based on current variables, by the way, be sure to useprintf %q
to safely escape their contents. For instance, to set your current$1
,$2
, etc. to be active duringstart.sh
execution:This is far more efficient than using
>>/start.sh
on every line that needs to append: Usingexec 3>file
and then>&3
only opens the file once, rather than opening it once per command that generates output.