pfnuesel Asked: 2018-10-31 19:26:17 +0800 CST2018-10-31 19:26:17 +0800 CST 2018-10-31 19:26:17 +0800 CST 使用多行分配变量 772 我有一个功能 f(){ echo 777 } 和一个变量,我将函数的“返回值”分配给它。 x=$(f) 非常简洁!然而,在我的真实代码中,变量和函数的名称要长一些,而且函数也吃位置参数,所以上面的简洁行变得很长。因为我喜欢保持整洁,所以我想将上面的代码分成两行。 x=\ $(f) 仍然有效!但是:保持整洁也意味着尊重缩进,这样就可以得到类似的东西 if foo x=\ $(f) fi 由于空格,它不再起作用了!有没有好的解决方法? bash newlines 4 个回答 Voted Gilles 'SO- stop being evil' 2018-11-01T00:49:50+08:002018-11-01T00:49:50+08:00 为什么要选择复杂、难以阅读的结构?有一种非常自然的方式来呈现这一点,不需要任何中间分配、构建空字符串的花哨方式、引用细微之处或其他认知负担。 if foo; then x=$( a_very_long_command_name --option1='argument 1 is long' \ --option2='argument 2 is long as well' ) fi Best Answer Crestwave 2018-10-31T20:59:36+08:002018-10-31T20:59:36+08:00 您可以将值存储在 中$_,该值设置为最后一个参数: if foo; then : "$(f)" x=$_ fi 或者可以使用 subshell 来吃缩进: if foo; then x=$( )$(f) fi Inian 2018-10-31T20:19:02+08:002018-10-31T20:19:02+08:00 如果您被允许使用 here-docs,则以下样式效果很好。用前导引用 here-doc 字符串允许您的代码仅-用于制表符。 就像是 if true; then read -d '' -r x <<-EOF $(f) EOF fi 但请记住,从上面复制粘贴代码不起作用,因为 Stack Exchange 会用空格替换制表符。您需要仔细输入以Tabhere-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错误。 ewatt 2018-10-31T21:22:29+08:002018-10-31T21:22:29+08:00 为什么要在等号处分割线?您可以在单独的变量中设置函数的参数: unset args args+='arg1 ' args+='arg2 ' args+='arg3 ' x=$(f $args)
为什么要选择复杂、难以阅读的结构?有一种非常自然的方式来呈现这一点,不需要任何中间分配、构建空字符串的花哨方式、引用细微之处或其他认知负担。
您可以将值存储在 中
$_
,该值设置为最后一个参数:或者可以使用 subshell 来吃缩进:
如果您被允许使用 here-docs,则以下样式效果很好。用前导引用 here-doc 字符串允许您的代码仅
-
用于制表符。就像是
但请记住,从上面复制粘贴代码不起作用,因为 Stack Exchange 会用空格替换制表符。您需要仔细输入以Tabhere-doc 开头的行和以 here-doc 结尾的行的字符。我的
vim
配置已将制表符映射到 8 个空格。如果你想让它更整洁,vim
通过将制表符的间距设置为 4 个空格来修改间距规则:set tabstop=4
您可以Tab通过使用查看它在我的脚本中的格式
sed
注意
\t
上面的 here-doc 字符串中的字符。如果您的脚本看起来与上述不同,您会看到抱怨的意外EOF
错误。为什么要在等号处分割线?您可以在单独的变量中设置函数的参数: