我有一个函数
f(){
echo 777
}
以及一个变量,我将函数的“返回值”分配给该变量。
x=$(f)
非常简洁!然而,在我的真实代码中,变量和函数名称相当长,并且函数还使用位置参数,因此上面的简洁行变得非常长。由于我喜欢保持整洁,因此我想将上面的代码分成两行。
x=\
$(f)
仍然有效!但是:保持事物整洁也意味着尊重缩进,这样就给出了类似的东西
if foo
x=\
$(f)
fi
由于空格,它不再起作用!有没有一个好的解决方法?
答案1
为什么要采用复杂、难以阅读的结构?有一种完全自然的方式来呈现它,不需要任何中间作业、构建空字符串的奇特方式、引用微妙之处或其他认知负担。
if foo; then
x=$(
a_very_long_command_name --option1='argument 1 is long' \
--option2='argument 2 is long as well'
)
fi
答案2
您可以将值存储在 中$_
,该值设置为最后一个参数:
if foo; then
: "$(f)"
x=$_
fi
或者可以使用子 shell 来吃掉缩进:
if foo; then
x=$(
)$(f)
fi
答案3
如果您被允许使用here-docs,则以下样式效果很好。使用前导引用here-doc字符串-
可以让您的代码使用制表符仅有的。
就像是
if true; then
read -d '' -r x <<-EOF
$(f)
EOF
fi
但请记住,复制粘贴上面的代码不起作用,因为 Stack Exchange 会用空格替换制表符。您需要仔细输入Tab以here-doc 开头的行和以here-doc 结尾的行的字符。我的vim
配置已将制表符映射到 8 个空格。如果你想让它更整洁,请修改间距规则,vim
将制表符的间距设置为 4 个空格,如下所示:set tabstop=4
您可以Tab通过使用以下命令查看我的脚本中的格式sed
$ sed -n l script.sh
#!/usr/bin/env bash$
$
$
f(){$
echo 777$
}$
$
if true; then$
\tread -d '' -r x <<-PERSON$
\t$(f)$
\tPERSON$
fi$
$
echo $x$
请注意\t
上面的here-doc 字符串中的字符。如果您的脚本看起来与上面有任何不同,您会看到抱怨的意外EOF
错误。
答案4
为什么要在等号处分割线?您可以在单独的变量中设置函数的参数:
unset args
args+='arg1 '
args+='arg2 '
args+='arg3 '
x=$(f $args)