在函数中保留尾随的换行符将导致bash

在函数中保留尾随的换行符将导致bash,bash,Bash,bash脚本不知何故丢失了所有尾随的换行符,但我不知道它们在哪里,也不知道如何保存它们 #!/bin/bash function rep { FIRST=${1// /" "} SECOND=${FIRST//&t;/" "} echo "${SECOND//&nl;/" "}" } if [ "$7" == "" ] then cd "$(rep $6)" th sample.lua -checkpoint cv/

bash脚本不知何故丢失了所有尾随的换行符,但我不知道它们在哪里,也不知道如何保存它们

#!/bin/bash
function rep {
    FIRST=${1// /" "}
    SECOND=${FIRST//&t;/"   "}
    echo "${SECOND//&nl;/"
"}"
}

if [ "$7" == "" ]
then
    cd "$(rep $6)"
    th sample.lua -checkpoint cv/"$(rep $1})"/"$(rep $2)" -length $3 -temperature $4 -sample 1 > samples/"$(rep $1)"/Sample-$5.txt
else
    cd "$(rep $7)"
    th sample.lua -checkpoint cv/"$(rep $1)"/"$(rep $2)" -length $3 -temperature $4 -sample 1 -start_text "$(rep $5)" > samples/"$(rep $1)"/Sample-$6.txt
fi
在这个脚本中,
rep
函数替换我在输入字符串中创建的标记,这些标记替换为空格、制表符和换行符。我很确定任何空格和换行符都会被删除

我已经看过这样的解决方案,但我还没能让它在代码中工作

编辑-这是我尝试向变量添加虚拟字符时的函数

function rep {
    FIRST="${1// /" "}"
    SECOND="${FIRST//&t;/"  "}"
    THIRD="${SECOND//&nl;/"
"}"
    a=$(printf $THIRD; printf x); echo ${a%x}
}
这里是另一个尝试,这仍然可以摆脱所有的尾随新行

#!/bin/bash
function rep {
    IN="$1x"
    FIRST="${IN// /" "}"
    SECOND="${FIRST//&t;/"  "}"
    THIRD="${SECOND//&nl;/"
"}"
    echo "${THIRD%x}"
}

echo "$(rep $5)"

if [ "$7" == "" ]
then
    cd "$(rep $6)"
    th sample.lua -checkpoint cv/"$(rep $1})"/"$(rep $2)" -length $3 -temperature $4 -sample 1 > samples/"$(rep $1)"/Sample-$5.txt
else
    cd "$(rep $7)"
    th sample.lua -checkpoint cv/"$(rep $1)"/"$(rep $2)" -length $3 -temperature $4 -sample 1 -start_text "$(rep $5)" > samples/"$(rep $1)"/Sample-$6.txt
fi
有关执行间接赋值的各种方法,请参见。这使您可以在同一个shell中运行函数,在该shell中,您需要将其输出显示在变量中,因此不需要命令替换(并且您可以避免为子shell支付
fork()
ing的性能损失)

rep(){
本地输出=$1输入=$2数据
数据=${in//}
data=${data//&t;/$'\t'}
data=${data/&nl;/$'\n'}
printf-v“$out”%s“$data”
}
输入class='hello world&nl;'
代表结果变量“$input”
打印文件“%s\n”
…作为输出正确发射:

<hello   world
>

请注意,赋值隐式地不受字符串拆分和全局展开的限制,因此不需要引用右侧,除非在执行展开之前将其内容解析为多个单词。

有关执行间接赋值的各种方法,请参阅。这使您可以在同一个shell中运行函数,在该shell中,您需要将其输出显示在变量中,因此不需要命令替换(并且您可以避免为子shell支付
fork()
ing的性能损失)

rep(){
本地输出=$1输入=$2数据
数据=${in//}
data=${data//&t;/$'\t'}
data=${data/&nl;/$'\n'}
printf-v“$out”%s“$data”
}
输入class='hello world&nl;'
代表结果变量“$input”
打印文件“%s\n”
…作为输出正确发射:

<hello   world
>


请注意,赋值隐式地不受字符串拆分和全局展开的限制,因此不需要引用右侧,除非在展开之前将其内容解析为多个单词。

Yes;命令替换将删除尾随的新行。链接的答案提供了一些解决方案,当这是不可取的;你尝试了哪种方法?我在命令中使用字符时尝试了添加字符并将其删除,但我无法完成这项工作,另外两项我无法找到正确的实现方法如果你展示你的尝试会有所帮助的,我更新了这个问题,以包括我尝试的内容您必须从命令替换的结果中去掉额外的
x
<代码>foo(){echo$'foo\n\n';};y=$(foo);y=${y%x}。是;命令替换将删除尾随的新行。链接的答案提供了一些解决方案,当这是不可取的;你尝试了哪种方法?我在命令中使用字符时尝试了添加字符并将其删除,但我无法完成这项工作,另外两项我无法找到正确的实现方法如果你展示你的尝试会有所帮助的,我更新了这个问题,以包括我尝试的内容您必须从命令替换的结果中去掉额外的
x
<代码>foo(){echo$'foo\n\n';};y=$(foo);y=${y%x}。非常感谢!我非常感谢您提供的所有帮助,这是一个很好的答案,而且它的代码比我在Bash中所能做的要好。非常感谢!我感谢您提供的所有帮助,这是一个很好的答案,它的代码比我在Bash中所能做的更好。