【发布时间】: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]匹配不是.、s和h的单个字符。试试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将读取脚本的内容,将其更改应用于这些内容,并将修改后的脚本打印到其标准输出(可能是终端)。