我有一个简单的文件,执行时,它将采用文件名,通过exiftool运行,并将该输出生成到file.txt。
我唯一的问题是,当我打印exiftool输出时,我得到了良好的格式,每个元素在单独的行上。当我稍后将它管道传输到一个文件时,它显示没有新行,因此所有文本都在一行上。
怎么解决这个问题?
这是代码:
read -p 'File name: ' fileName
result=$(exiftool ./Files/$fileName)
printf "File Meta-data: \n $result\n\n"
echo $result >> ./report1.txt
第三行打印以下内容,这是我的目的有效格式:
ExifTool Version Number : 10.10
File Name : names.txt
Directory : ./Files
File Size : 46 bytes
File Modification Date/Time : 2018:03:01 19:45:32-08:00
File Access Date/Time : 2018:03:01 19:47:42-08:00
File Inode Change Date/Time : 2018:03:01 19:45:32-08:00
File Permissions : rw-rw-r--
Error : Unknown file type
但是当我检查report1.txt时,我看到以下格式:
ExifTool Version Number : 10.10 File Name : names.txt Directory : ./Files File Size : 46 bytes File Modification Date/Time : 2018:03:01 19:45:32-08:00 File Access Date/Time : 2018:03:01 19:47:42-08:00 File Inode Change Date/Time : 2018:03:01 19:45:32-08:00 File Permissions : rw-rw-r-- Error : Unknown file type
问题是echo $result >> ./report1.txt
中的未引用变量。
当你有一个不带引号的变量时,在执行echo
之前,bash本身将使用所有空格(包括换行符)。
假设你有变量var="My String"
。要有效地执行echo "My String"
命令,你必须编写echo "$var"
。当你调用echo $var
(没有引号)时,bash将执行echo "My" "String"
。
在这个例子中没有区别,因为echo
用空格加入它的参数(My
和String
)。但是,如果您的变量包含制表符或换行符,则它们将替换为空格。
read -p 'File name: ' fileName
result="$(exiftool "./Files/$fileName")"
printf 'File Meta-data:\n%s\n\n' "$result"
echo "$result" >> ./report1.txt
在tee
的帮助下,您不需要$result
变量。 tee
同时将其stdin重定向到文件和stdout。 tee -a
附加到文件而不是覆盖文件。
read -p 'File name: ' fileName
echo 'File Meta-data:'
exiftool "./Files/$fileName" | tee -a ./report1.txt