What is the most aesthetic way to to escape a single quote within a single-quoted string in (ba)sh?

前端 未结 5 1329
予麋鹿
予麋鹿 2021-01-26 06:23

In a (ba)sh script of mine, I have, for example:

MYVAR=\'Alice says: \"Hello, Bob.\" But Bob isn\'t listening.\'

This is a syntax error, since

相关标签:
5条回答
  • 2021-01-26 06:58

    A non-POSIX solution which is supported in bash, at least, is the following:

    MYVAR=$'Alice says: "Hello, Bob." But Bob isn\'t listening.'
    

    The $ causes escape processing.

    0 讨论(0)
  • 2021-01-26 07:00

    Using a HEREDOC is a good way to deal with this:

    read MYVAR << \EOF
    Alice says: "Hello, Bob." But Bob isn't listening.
    EOF
    
    0 讨论(0)
  • 2021-01-26 07:06

    You could also use double quotes and escaping. I guess, it is simpler than change the language:

    MYVAR="Alice says: \"Hello, Bob.\" But Bob isn't listening."
    

    More information about escaping symbols in bash.

    0 讨论(0)
  • 2021-01-26 07:12

    No, you can't embed a single quote inside a single quoted string in Bash (or korn shell). It is a feature of the language you have chosen. Inside single quotes there are no special characters, and that includes \.

    This is a variation on one of your solutions, and it is ugly:

     echo 'Alice says: "Hello, Bob." But Bob isn'\''t listening.'
    

    gives:

    Alice says: "Hello, Bob." But Bob isn't listening.
    

    Alternatively use a different language, like Perl or Python.

    0 讨论(0)
  • 2021-01-26 07:20

    I'm not sure why switching to $'...' is an option but switching to double quotes is not (presumably to prevent some sort of parameter expansion). But you don't need to double quote the entire string:

    MYVAR='Alice says: "Hello, Bob." But Bob '"isn't"' listening.'
    
    0 讨论(0)
提交回复
热议问题