bash:处理奇怪的文件名tail无效选项--1

时间:2017-05-24 07:12:45

标签: bash filenames tail

我希望我的脚本找到一个文件(在当前目录中),第一行等于START。然后该文件应该以{{1​​}}作为最后一行。所以我想提取FILE <file_name> - 我为此使用<file_name>。它适用于标准文件名,但非标准文件名(例如taila aa+b-c\ = e报告tail

时出现问题

这是脚本的开头:

tail option used in invalid context -- 1

我试图以这种方式用括号来接受#!/bin/bash next_stop=0; # find the first file start_file=$(find . -type f -exec sed '/START/F;Q' {} \;) mv "$start_file" $start_file # << that trick doesn't work if [ ! -f "$start_file" ] then echo "File with 'START' head not found." exit 1 else echo "Found $start_file" fi # parse the last line of the start file last_line=$(tail -1 $start_file) # << here it crashes for hacky names echo "last line: $last_line" if [[ $last_line == FILE* ]] ; then next_file=${last_line#* } echo "next file from last line: $next_file" elif [[ $last_line == STOP ]] ; then next_stop=true; else echo "No match for either FILE or STOP => exit" exit 1 fi 输出

find

但它没有帮助

2 个答案:

答案 0 :(得分:1)

对于你的两个例子,你需要在文件名(带\ character)中转义空格和egual,以及转义转义字符。 因此a a传递到尾部时必须为a\ aa+b-c\ = e必须为a+b-c\\\ \=\ e。 您可以使用sed进行此替换。

This example为您提供更好,更轻松的替代方式:

printf '%q' "$Strange_filename"

答案 1 :(得分:1)

转义字符会发生此错误。 你应该用引号将它写成start_file变量。 last_line = $(tail -1 $ start_file) - &gt; last_line = $(tail -1“$ start_file”)