2

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

我是 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 子系统。

4

1 回答 1

2

看来您对 bash 替换有些困惑;您正在尝试执行命令子外壳程序(例如`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 Hackers Wiki - 命令替换

于 2018-06-17T05:14:15.840 回答