我希望我的脚本找到一个文件(在当前目录中),第一行等于START
。然后该文件应该以{{1}}作为最后一行。所以我想提取FILE <file_name>
- 我为此使用<file_name>
。它适用于标准文件名,但非标准文件名(例如tail
或a a
,a+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
但它没有帮助
答案 0 :(得分:1)
对于你的两个例子,你需要在文件名(带\ character)中转义空格和egual,以及转义转义字符。
因此a a
传递到尾部时必须为a\ a
,a+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”)