passing bash variable to perl command in bash script

January 18, 2013

Recently I tried passing a bash variable to perl command in bash script, it didn’t end well.

Troy Engel from http://tacticalvim.wordpress.com/ was nice enough to point out the issue:

use sed instead of perl for what you need; it’s simpler, faster and uses the bash variables easily.

I set up a test script /home/someuser/test.sh to show:

===
# cat test.conf
A=domain
B=PATH_DEST
===
# cat test.sh
domain="test"
PATH_DEST_APACHE="/test"
PATH_DEST_CONFIG="/home/someuser/${domain}.conf"

sed -i "s|domain|${domain}|g" "${PATH_DEST_CONFIG}"
sed -i "s|PATH_DEST|${PATH_DEST_APACHE}|g" "${PATH_DEST_CONFIG}"
===
# sh -x ./test.sh
+ domain=test
+ PATH_DEST_APACHE=/test
+ PATH_DEST_CONFIG=/home/someuser/test.conf
+ sed -i 's|domain|test|g' /home/someuser/test.conf
+ sed -i 's|PATH_DEST|/test|g' /home/someuser/test.conf
===
# cat test.conf
A=test
B=/test
===

What’s important to note is that A, you *must* use double-quotes in the sed expression so that variable expansion works; single-quotes inhibits expansion. B, as you found out, you need to use something other than “/” as your expression separator since you have a replacement variable with that character in it. I used pipes in sed, but you could use almost anything (“#”, etc.) for the same effect.