bash 脚本 - 需要语法帮助

bash 脚本 - 需要语法帮助

我正在读取 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

  1. 您应该引用所有变量替换,否则值中的空白或其他 shell 魔术字符会将其分解为单独的参数或产生不需要的效果。
  2. grep 在每个搜索字符串之前应该有一个“-e”,而不是在第二个字符串之前。由于字符串看起来是相同的,所以当然可以省略一根。
  3. 正如评论中提到的,将“cp”中的“to”去掉。
  4. $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"

同样,要检查该行是否包含$stringor $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

相关内容