Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Prevent shell from escaping single quotes

Tags:

bash

sh

Script:

#!/bin/sh -x
ARGS=""
CMD="./run_this_prog"
. . . 
ARGS="-first_args '-A select[val]' "
. . . 
$CMD $ARGS

I want the commandline to be expanded like this when I run this shell script:

./run_this_prog -first_args '-A select[val]'

Instead what shell does (note the added '\' before each single quote):

+ ARGS=
+ CMD='./run_this_prog'
+ ARGS='-first_args '\''-A select[val]'\'' '

and what it ran on commandline (escaped every special char - Not what I want):

./run_this_prog -first_args \'\-A select\[val\]\'

I tried escaping single quotes like :

ARGS="-first_args \'-A select[val]\' "

But that resulted in (added '\' after each backslash):

+ ARGS=
+ CMD='./run_this_prog'
+ ARGS='-first_args \'\''-A select[val]\'\'' '

I did my googling but couldn't find anything relevant. What am I missing here? I am using sh-3.2 on rel6 centOS.

like image 280
Shaardyy Avatar asked Oct 15 '25 11:10

Shaardyy


1 Answers

Once a quote is inside a string, it will not work the way you want: Inside a string quotes are not syntactic elements, they are just literal characters. This is one reason why bash offers arrays.

Replace:

#!/bin/sh -x
...
ARGS="-first_args '-A select[val]' "
$CMD $ARGS

With:

#!/bin/bash -x
...
ARGS=(-first_args '-A select[val]')
"$CMD" "${ARGS[@]}"

For a much more detailed discussion of this issue, see: "I'm trying to put a command in a variable, but the complex cases always fail!"

like image 62
John1024 Avatar answered Oct 18 '25 06:10

John1024



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!