alexus
alexus

Reputation: 7465

Shell scripting and using backslashes with back-ticks?

I'm trying to do some manipulation with Wordpress and I'm trying to write a script for it...

# cat /usr/local/uftwf/_wr.sh 
#!/bin/sh
# $Id$
#

table_prefix=`grep ^\$table_prefix wp-config.php | awk -F\' '{print $2}'`
echo $table_prefix
# 

Yet I'm getting following output

# /usr/local/uftwf/_wr.sh 
 ABSPATH ABSPATH wp-settings.php_KEY LOGGED_IN_KEY NONCE_KEY AUTH_SALT SECURE_AUTH_SALT LOGGED_IN_SALT NONCE_SALT wp_0zw2h5_ de_DE WPLANG WP_DEBUG s all, stop editing! Happy blogging. */
# 

Running from command line, I get the correct output that I'm looking for:

# grep ^\$table_prefix wp-config.php | awk -F\' '{print $2}'
wp_0zw2h5_
# 

What is going wrong in the script?

Upvotes: 1

Views: 541

Answers (4)

Hai Vu
Hai Vu

Reputation: 40733

Does this one work for you?

 awk -F\' '/^\$table_prefix/ {print $2}' wp-config.php

Update

If you are using shell scripting, there is no need to call up awk, grep:

#!/bin/sh
while read varName op varValue theRest
do
    if [ "_$varName" = "_\$table_prefix" ]
    then
        table_prefix=${varValue//\'/}   # Remove the single quotes
        table_prefix=${table_prefix/;/} # Remove the semicolon
        break
    fi
done < wp-config.php

echo "Found: $table_prefix"

Upvotes: 1

Gilles Qu&#233;not
Gilles Qu&#233;not

Reputation: 185189

You should try

#!/bin/sh

table_prefix=$(awk -F"'" '/^\$table_prefix/{print $2}' wp-config.php)
echo $table_prefix

Upvotes: 1

Jonathan Leffler
Jonathan Leffler

Reputation: 754010

The problem is the grep command:

table_prefix=`grep ^\$table_prefix wp-config.php | awk -F\' '{print $2}'`

It either needs three backslashes - not one - or you need to use single quotes (which is much simpler):

table_prefix=$(grep '^$table_prefix' wp-config.php | awk -F"'" '{print $2}')

It's also worth using the $( ... ) notation in general.

The trouble is that the backquotes removes the backslash, so the shell variable is evaluated, and what's passed to grep is, most likely, just ^, and each line starts with a beginning of line.

Upvotes: 2

Anya Shenanigans
Anya Shenanigans

Reputation: 94654

This has all the appearance as though the grep is not omitting all the lines that are not matching, when you issue the echo $table_prefix without quotes it collapses all the white space into a single output line, if you issue an: echo "$table_prefix", you would see the match with all the other white-space that was output.

I'd recommend the following sed expression instead:

table_prefix=$(sed -n "s/^\$table_prefix.*'\([^']*\)'.*/\1/p" wp-config.php)

Upvotes: 1

Related Questions