使用多行分配变量

使用多行分配变量

我有一个函数

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)

相关内容