1

I would like to execute a command in a bash script that needs both double and single quotes in it.

The command that I want to run looks like this:

some_command --query "'val' is not null"

What I try to achieve is to build this command and execute it from a bash script

command='some_command --query " 'val' is not null "'
output=$($command)
# + some_command --query '"' val is not null '"'

command='some_command --query \" 'val' is not null \"'
output=$($command)
# + some_command --query '\"' val is not null '\"'

But then the command is executed with the quotes being quoted so the actial command has a wrong syntax.

I already tried a ton of different methods like using the character codes or building the command with an array followed by executing with "${array[@]}" but all were to no avail.

update: I'm running this with bash version GNU bash, version 4.3.11(1)-release (x86_64-pc-linux-gnu)

  • 1
    The answer is right there in your question. The single quotes around the command and the backslashes in front of the double quotes interpret the quotes as characters in the command and not as special characters. It will also treat the backslashes as interpretable characters. What you want are single quotes on the outside and single quotes in the inside. With that, you also don't need the backslashes before the double quotes nor do you need $() around $command. – Nasir Riley Apr 3 at 23:27
1

Trying to put complex commands into a simple variable is bound to fail. For details, see I'm trying to put a command in a variable, but the complex cases always fail!.

In all likelihood, what you are trying to do is better accomplished with a bash function.

If you really really want to use a variable, then use a bash array:

command=(some_command --query " 'val' is not null ")
"${command[@]}"

We can see the actual value of the array command by using declare:

$ declare -p command
declare -a command=([0]="some_command" [1]="--query" [2]=" 'val' is not null ")

We can see that this preserves the single quotes around val.

Example

$ command=(echo -E " 'val' is not null ")
$ "${command[@]}"
 'val' is not null 
  • I tried the suggestion with the array, but when I run declare -p command the output holds ... [2]=" '\''\'\'''\''val'\''\'\'''\'' is not null "... I updated my question with the bash version. – Hans Vn Apr 4 at 9:19
  • 1
    Ok, got it working with a string after @nasir-riley's suggerstion in his comment, apparently it is OK for single quotes to be escaped in the debugged output. – Hans Vn Apr 4 at 15:22

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.