我想用长命令整理一些脚本,例如:
{ 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"