我正在尝试编写一个程序,该程序获取文件名并在其上添加日期。所以我试图获取文件名本身和扩展名的子字符串。
我是 BASH 新手,所以也许我在这里遗漏了一些东西,但是按照在线指南,这似乎应该可行 -
#!/bin/bash
echo "Type filename in this dir"
read filename
file=`filename%.*`
end=`filename##*.`
today=`date +%d-%m-%y`
dated="${file}_${today}.${end}"
cat $filename > $dated
但是计算机返回这些错误 -
./fileDater.sh: line 5: filename%.*: command not found
./fileDater.sh: line 6: filename##*.: command not found
如果这很重要的话,我正在 Windows 10 上使用 Ubuntu 子系统。
最佳答案
看来您对 bash 替换有些困惑;您正在尝试执行命令子 shell(例如 `variable##*.`
) - 它应该使用 ${ ... }
.
#!/bin/bash
echo "Type filename in this dir"
read -r filename
file=${filename%.*}
end=${filename##*.}
today=$(date +%d-%m-%y)
dated="${file}_${today}.${end}"
cat "$filename" > "$dated"
我还没有尝试过你的脚本,尽管我相信这是你的主要问题。
编辑:关于反引号的使用 (`...`
)
以 `COMMAND`
的形式,它对于 Bash 来说或多或少已经过时了,因为它在嵌套(“内部”反引号需要转义)和转义字符方面存在一些问题。
使用 $(COMMAND)
来代替 - 这也是 POSIX!
关于用于检索文件名的 BASH 字符串运算符语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50893875/