Bash 长字符串,没有分词?

Bash 长字符串,没有分词?

我想用长命令整理一些脚本,例如:

{ somecheck || somecomand "reallyreallyreallyreallyreallyreallylongstring" } &> /dev/null &

变成这样的东西:

{ somecheck ||                   \
    somecomand "reallyreally"    \
        "reallyreally"           \
        "reallyreally"           \
        "longstring"             \
} &> /dev/null &

但我担心分词。为了避免这种情况,我正在考虑:

{ somecheck ||                   \
    somecomand  "$(echo          \
        "reallyreally"           \
        "reallyreally"           \
        "reallyreally"           \
        "longstring"             \
    )"                           \
} &> /dev/null &

有谁知道在 bash/zsh 中执行多行字符串的其他方法吗?我在谷歌上搜索此信息时遇到麻烦,我认为这意味着至少三个进程(脚本、背景块和命令替换子 shell);也许有更好的方法?

提前致谢!

答案1

使用这样的行延续会在字符串中添加空格:该序列backslash-newline-whitespace将被单个空格替换。

仅使用变量将大大提高可读性:

url="reallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallyreallylongstring"
{ somecheck || somecomand "$url" } &> /dev/null &

您仍然可以使用数组将其分解为子字符串

parts=(
    "reallyreallyreallyreally"
    "reallyreallyreallyreally"
    "reallyreallyreallyreally"
    "reallyreallyreallyreally"
    "longstring"
)
whole=$(IFS=; echo "${parts[*]}")

但是考虑到复杂性的增加,分割文字字符串真的那么重要吗?

答案2

好吧,你可以稍微简化一下:

$ [ -f /dev/null ] || sed 's/a/A/g' <(echo "thisis""avery"\
"long""string"\
"Ihave""separated"\
"into""smaller"\
"substrings")
thisisAverylongstringIhAvesepArAtedintosmAllersubstrings

重要的一点是输入字符串中不要有任何额外的空格,因此\.

格伦关于使用变量的建议既漂亮又简单,就这样吧。

答案3

我建议采用介于 Glenn 的两个建议之间的方法:使用(简单的标量)变量,但将其定义分成多行:

myword="super"
myword="${myword}cali"
myword="${myword}fragil"
myword="${myword}istic"
myword="${myword}expi"
myword="${myword}ali"
myword="${myword}docious"

相关内容