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

时间:2017-08-01 21:48:01

标签: 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/"$(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替换了我在输入字符串中替换为空格,制表符和换行符的标记。我很确定任何空格和换行符都会被删掉。

我已经查看了这样的解决方案,https://stackoverflow.com/a/15184414/5332233,但我无法在代码中使用它。

编辑 - 这是我尝试在变量

中添加虚拟角色时的功能
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

2 个答案:

答案 0 :(得分:3)

有关执行间接分配的各种方法,请参阅BashFAQ #6。这使得您可以在同一个shell中运行您的函数,您需要将其输出存在于变量中,因此不需要命令替换(并且您可以避免支付fork()除了子shell之外的性能损失。

rep() {
  local out=$1 in=$2 data
  data=${in// / }
  data=${data//&t;/$'\t'}
  data=${data//&nl;/$'\n'}
  printf -v "$out" %s "$data"
}

input='hello   world&nl;'
rep result_var "$input"
printf '%s\n' "<${result_var}>"

......正确地作为输出发光:

<hello   world
>

请注意,赋值可以隐式地免除字符串拆分和glob扩展,因此右侧不需要引用,除非它们的内容在扩展被尊重之前被解析为多个单词

答案 1 :(得分:-1)

不是使用函数,而是将每个参数放入变量并分别执行操作,而不是使用函数。