我是一名学习者,我刚刚创建了一个新的 bash 脚本,该脚本从命令行读取两个文件名并将它们的内容连接起来打印。但是,它不起作用。我有两个文件:log1.txt 和 log2.txt,它们都以换行符结尾。我的代码基本上是这样的:
File+=$(cat "$first")
File+=$(cat "$second")
echo "$File"
但是,第一个文件的结尾和第二个文件的开头合并为一行。我该如何解决?我已经在谷歌上搜索了几个小时,如果有任何帮助,我将不胜感激。
答案 0 :(得分:0)
命令替换会修剪命令运行输出中的任何尾随换行符。这种行为是 POSIX 标准强制要求的——如果不这样做是没有意义的,因为 POSIX 规定 UNIXy 系统上的所有有效文本行必须以换行符终止;所以人们将需要不断地修剪尾随的换行符,否则的话。
但是,您没有理由将引入该换行符作为 shell 的问题:
cat
代表“连接”;当给定多个文件时,它将它们连接在一起。如果您没有传递多个参数,那么您通常一开始就没有充分的理由使用它。
File=$(cat "$first" "$second")
答案 1 :(得分:0)
Command substitutions 从内部的复合命令中删除标准输出末尾的任何尾随换行符(甚至多个换行符)。解决这个问题的两种主要方法是
第一个的简单实现是这种模式:
name="$(some_command; echo x)"
name="${name%x}"
避免命令替换的最简单方法是将每个文件连接到一个单独的文件:
cleanup() {
if [[ -d "$work_dir" ]]
then
rm --force --recursive "$work_dir"
fi
}
trap cleanup EXIT
work_dir="$(mktemp --directory)"
aggregate_file="${work_dir}/aggregate"
cat "$first" > "$aggregate_file"
…