我正在读取 4 个不同文件的最后一行,并 grep 查找某个字符串。根据该字符串,我需要重命名源文件。所有 4 个文件都有不同的 grep 字符串和最终目标名称。
if tail -n1 $f | grep $string -e $string; then cp $f to file.new
else tail -n1 $f |grep $sting2 -e $string2; then cp $f to file2.new
答案1
- 您应该引用所有变量替换,否则值中的空白或其他 shell 魔术字符会将其分解为单独的参数或产生不需要的效果。
- grep 在每个搜索字符串之前应该有一个“-e”,而不是在第二个字符串之前。由于字符串看起来是相同的,所以当然可以省略一根。
- 正如评论中提到的,将“cp”中的“to”去掉。
- $string2 第一次出现时存在拼写错误(缺少 r) - 如果这是复制和粘贴,则原始代码可能具有相同的拼写错误。
if tail -n1 "$f" | grep -e "$string"; then cp "$f" file.new
else tail -n1 "$f" |grep -e "$string2"; then cp "$f" file2.new
else ... string3 file3
else ... string4 file4
fi
答案2
tail -n1 $f
不是获取路径存储在 中的文件的最后一行的正确语法$f
。正确的语法是tail -n1 -- "$f"
或者更好(因此它也适用于名为 的文件-
):tail -n1 < "$f"
。
同样,要检查该行是否包含$string
or $string2
,语法将为grep -F -e "$string" -e "$string2"
。
无论如何,在 bash 和大多数其他类似 Bourne 的 shell 中,将参数扩展不加引号几乎没有意义。
在这里,您似乎应该使用一个case
声明:
case "$(tail -n1 < "$f")" in
(*"$string"*) cp -- "$f" file.new;;
(*"$string2"*) cp -- "$f" file2.new;;
esac