Bash 删除起始空格制表符输出回音多行字符串

Bash 删除起始空格制表符输出回音多行字符串,bash,shell,Bash,Shell,我不知道如何缩进bash脚本的某些部分,从而在代码中保留缩进。我希望输出格式正确,输出行没有任何制表符/空格前缀 例:脚本 #!/bin/bash INFO1="something output1" INFO2="output2" MY_INFO=INFO1 if [ True ]; then INFO=" Here are the test results bbb ccc aaa ${!MY_INFO} " fi echo "${I

我不知道如何缩进bash脚本的某些部分,从而在代码中保留缩进。我希望输出格式正确,输出行没有任何制表符/空格前缀

例:脚本

#!/bin/bash

INFO1="something
output1"
INFO2="output2"
MY_INFO=INFO1

if [ True ]; then
    INFO="
    Here are the test results
    bbb
    ccc
    aaa
    ${!MY_INFO}
    " 
fi
echo "${INFO}"
返回的输出:

    Here are the test results
    bbb
    ccc
    aaa
    something
output1
预期产出:

Here are the test results
bbb
ccc
aaa
something
output1

保留引号的空格不是bug,而是特性。这就是双引号的含义

另一个问题是
bash
(不同于
python
),不知道缩进的可读性——对于
bash
,一个不带引号的空格等于一千

各种补救办法:

  • 引用多行字符串时放弃缩进,即:

    if [ True ]; then
    INFO="
    Here are the test results
    bbb
    ccc
    aaa
    ${!MY_INFO}
    " 
    fi
    
  • 使用
    bash
    ,(或其他工具)使缩进消失。因此,首先定义一个缩进的多行字符串:

     foo="
          bar
          baz"
    
    然后调整$foo以删除空格:

     foo="${foo// }"
    
    现在,$foo不再缩进,但如果存在本应保留的空格,则缩进会过多

  • 与之前相同,但在显示时,(这更浪费),即:


  • 是否缺少一个
    echo$INFO
    ?更新了问题如果您回显该双引号变量,它将打印带有换行符和缩进的
    $INFO
    。如果你不加引号地回显它,你会在一行中得到它。如果你想
    echo
    某个东西,并且输出与该东西不同,你必须用
    sed
    之类的东西去掉前导空格。这个问题以前有过。@Varun,Q涉及源代码中的缩进,因此与多行字符串不同,多行字符串有额外的空间(保留缩进),在源代码中没有缩进。
    echo  "${foo// }"