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

时间:2018-06-17 05:06:57

标签: bash string-operations

我正在尝试编写一个带有文件名的程序,并将日期放在上面。所以我试图获取文件名本身和扩展名的子串。

我是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子系统,如果这很重要的话。

1 个答案:

答案 0 :(得分:2)

你似乎对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 Hackers Wiki - Command Substitution