BASH 用于检索文件名的字符串运算符语法

BASH string operator syntax for retrieving filename

我正在尝试编写一个程序来获取文件名并在上面加上日期。所以我正在尝试获取文件名本身和扩展名的子字符串。

我是 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

但是电脑returns这些错误-

./fileDater.sh: line 5: filename%.*: command not found
./fileDater.sh: line 6: filename##*.: command not found

我在 Windows 10 上使用 Ubuntu 子系统,如果这很重要的话。

您似乎对 bash 替换有些困惑;您正在尝试执行命令 sub-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,它或多或少已经过时了,因为它在嵌套("inner" 反引号需要转义)和转义字符方面存在一些问题。

改用$(COMMAND)——它也是POSIX!

Bash Hackers Wiki - Command Substitution