new line in bash parameter substitution ${REV%%\n*}

前端 未结 3 875
忘掉有多难
忘掉有多难 2021-02-08 22:40

does not work

echo ${REV%%\\n*}

does work

echo ${REV%%
*}

After reading trough http://tldp.org/LDP/abs/html/p

3条回答
  •  梦毁少年i
    2021-02-08 23:34

    If your intent is to try and get it on one line and you're willing to go "outside" of bash, you can use:

    echo "$(echo "${REV}" | head -1l)"
    

    But, assuming your version of bash is recent enough, you can try:

    pax> export REV="abc
    ...> def"
    
    pax> echo "${REV}"
    abc
    def
    
    pax> echo "${REV%%$'\n'*}"
    abc
    

    The reason you need $'\n' is because the bash definition of word is somewhat restrictive, compared to what you expect. The bash manpage has this to say:


    Words of the form $'string' are treated specially. The word expands
    to string, with backslash-escaped characters replaced as specified by
    the ANSI C standard. Backslash escape sequences, if present, are decoded
    as follows:
       \a     alert (bell)
       \b     backspace
       \e
       \E     an escape character
       \f     form feed
       \n     new line
       \r     carriage return
       \t     horizontal tab
       \v     vertical tab
       \\     backslash
       \'     single quote
       \"     double quote
       \nnn   the eight-bit character whose value is the octal value
              nnn (one to three digits)
       \xHH   the eight-bit character whose value is the hexadecimal
              value HH (one or two hex digits)
       \uHHHH the Unicode (ISO/IEC 10646) character whose value is
              the hexadecimal value HHHH (one to four  hex  digits)
       \UHHHHHHHH
              the  Unicode  (ISO/IEC 10646) character whose value is
              the hexadecimal value HHHHHHHH (one to eight hex digits)
       \cx    a control-x character
    

提交回复
热议问题