如何在bash中分解极长的字符串文字?

Sim*_*son 41 linux bash

我想在bash脚本中嵌入一个这样的长命令:

mycommand \
    --server myserver \
    --filename extremely/long/file/name/that/i/would/like/to/be/able/to/break/up/if/possible \
    --otherflag \
    --anotherflag
Run Code Online (Sandbox Code Playgroud)

打破长文件名.

我能做到这一点:

# Insufficiently pretty
mycommand \
    --server myserver \
    --filename extremely/long/file/name/\
that/i/would/like/to/be/able/to/break/\
up/if/possible \
    --otherflag \
    --anotherflag \
Run Code Online (Sandbox Code Playgroud)

但它打破了流动.我会喜欢能够这样写:

# Doesn't work
mycommand \
    --server myserver \
    --filename extremely/long/file/name/\
         that/i/would/like/to/be/able/to/break/\
         up/if/possible \
    --otherflag \
    --anotherflag
Run Code Online (Sandbox Code Playgroud)

但这不起作用,因为它打破了字符串文字.

有没有办法告诉bash打破字符串文字但忽略任何前导空格?

Chr*_*uma 52

有点像黑客,但这有效:

mycommand \
    --server myserver \
    --filename "extremely/long/file/name/"`
               `"that/i/would/like/to/be/able/to/break/"`
               `"up/if/possible" \
    --otherflag \
    --anotherflag
Run Code Online (Sandbox Code Playgroud)

Bash连接相邻的字符串文字,因此我们利用它.例如,echo "hi" "there"打印hi thereecho "hi""there"不是打印hithere.

它还利用了反引号操作符,以及一堆空格评估为空的事实.

  • 你可以把开头`\``放在前一行的末尾,而不是`\`行继续...它保持左边缘清洁 (2认同)

Wil*_*lQu 44

您可以使用变量:

file=extremely/long/file/name
file+=/that/i/would/like/to/be/able/to/break
file+=/up/if/possible

mycommand\
    --server myserver\
    --filename $file\
    --flag flag
Run Code Online (Sandbox Code Playgroud)

  • 好主意.你可以通过使用`+ =`运算符而不是`file = $ {file}/...`来使它更干净 (7认同)
  • +1:在我看来,这是最不混淆的方法.目的很明确. (5认同)

Ben*_* W. 6

将长字符串写入变量同时保持最大行长度的另一种方法:

printf -v fname '%s' \
    'extremely/long/file/name/that/i/' \
    'would/like/to/be/able/to/break/up/' \
    'if/possible'
Run Code Online (Sandbox Code Playgroud)

因为参数比格式化指令多,%s所以只是重复,我们得到

$ declare -p fname
declare -- fname="extremely/long/file/name/that/i/would/like/to/be/able/to/break/up/if/possible"
Run Code Online (Sandbox Code Playgroud)

可以像这样使用

$ declare -p fname
declare -- fname="extremely/long/file/name/that/i/would/like/to/be/able/to/break/up/if/possible"
Run Code Online (Sandbox Code Playgroud)

当设置具有本质上分离的内容的长变量时,这非常方便,例如CDPATH(或者PATH,当然):

mycommand \
    --server myserver \
    --filename "$fname" \
    --otherflag \
    --anotherflag
Run Code Online (Sandbox Code Playgroud)

相对于

printf -v CDPATH '%s' \
    ':/Users/benjamin/here/is/a/long/path' \
    ':/Users/benjamin/and/here/is/another/one' \
    ':/Users/benjamin/and/a/third/line'
export CDPATH
Run Code Online (Sandbox Code Playgroud)

或笨重的

export CDPATH=':/Users/benjamin/here/is/a/long/path:/Users/benjamin/and/here/is/another/one:/Users/benjamin/and/a/third/line'
Run Code Online (Sandbox Code Playgroud)