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
答案 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)
不是使用函数,而是将每个参数放入变量并分别执行操作,而不是使用函数。