【问题标题】:bash sript to check script file extension and adding an extension用于检查脚本文件扩展名并添加扩展名的 bash 脚本
【发布时间】:2021-06-17 22:49:30
【问题描述】:

我编写了以下 Bash 脚本。它的作用是检查自己的名字,如果扩展名不存在,用sed修改“.sh”。我仍然有错误“缺少目标文件...”

#!/bin/bash

FILE_NAME="$0"
EXTENSION=".sh"
FILE_NAME_MOD="$FILE_NAME$EXTENSION"

if [[ "$0" != "FILE_NAME_MOD" ]]; then
    
    echo mv -v "$FILENAME" "$FILENAME$EXTENSION"

    
    cp "$0" | sed 's/\([^.sh]\)$/\1.sh/g' $0

fi

【问题讨论】:

  • [^.sh] 匹配不是.sh 的单个字符。试试sed '/\.sh$/b;s/$/.sh/' "$0"sed '/\.sh$/!s/$/.sh/' "$0"
  • 条件有点不对。由于 FILE_NAME_MOD 设置为 $0 + EXTENSION,因此 $0 永远不会等于 FILE_NAME_MOD。因此,它总是评估为 true 并尝试复制以预期扩展名结尾的文件。这可能不是你想要的。
  • cp ... | sed ... 管道毫无意义。 cp 需要 2 个文件名,一个源和一个目标,并且不会将任何内容打印到标准输出(即管道)。同时,sed ... $0 将读取脚本的内容,将其更改应用于这些内容,并将修改后的脚本打印到其标准输出(可能是终端)。

标签: regex bash sed


【解决方案1】:

试试这个Shellcheck-clean 代码:

#! /bin/bash -p

file=${BASH_SOURCE[0]}
extension=.sh

[[ $file == *"$extension" ]] || mv -i -- "$file" "$file$extension"

【讨论】:

    【解决方案2】:

    只是为了好玩,这是一种仅使用 GNU sed 的方法:

    #!/usr/bin/env bash
    
    sed --silent '
    # match FILENAME only if it does not end with ".sh"
    /\.sh$/! {
        # change "FILENAME" to "mv -v FILENAME FILENAME.sh"
        s/.*/mv -v & &.sh/
        # execute the command
        e
    }
    ' <<<"$0"
    

    你也可以让上面的脚本输出有用的信息:

    #!/usr/bin/env bash
    
    sed --silent '
    /\.sh$/! {
        s/.*/mv -v & &.sh/
        e
        # exit with code 0 immediately after the change has been made
        q0
    }
    # otherwise exit with code 1
    q1
    ' <<<"$0" && echo 'done' || echo 'no changes were made'
    

    【讨论】:

      【解决方案3】:
      #!/bin/bash
      
      file="$0"
      extension=".sh"
      
      if [ $(echo -n $file | tail -c 3) != $extension ]; then
          mv -v "$file" "$file$extension"
      fi
      

      重要的东西:

      • -n 标志在末尾抑制新行,因此我们可以测试 3 个字符而不是 4 个
      • 如有疑问,请始终使用set -x 调试您的脚本。

      【讨论】:

      • 当他们想要一个不同的扩展时怎么办 - 用tail -c ${#extension}替换tail -c 3..
      • 或者全部在shell中完成(没有子shell/命令)..if [ "${file:(-${#extension})}" != "$extension" ];
      • 确实有很多方法可以解决这个问题@MrR :) 我的第一次尝试与你的类似,但我使用了${file:-3} 并忘记了- 表示未用括号括起来的默认值.. . :) 祝贺更清洁的解决方案。发布您的解决方案以获得支持。
      • 这是我经常去的裁判 - tldp.org/LDP/abs/html - @Niloct
      • @MrR The Advanced Bash-Scripting Guide 在教授草率的脚本编写实践方面名声不佳,例如不双引号变量引用(can cause problems.Greycat's BashFAQ 是更好的参考。
      猜你喜欢
      • 2010-09-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-24
      • 1970-01-01
      • 1970-01-01
      • 2014-08-28
      相关资源
      最近更新 更多