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

标签 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 子系统。

最佳答案

看来您对 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

关于用于检索文件名的 BASH 字符串运算符语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50893875/

相关文章:

执行定义与现有命令相同的函数的脚本时,Bash 崩溃

bash - 如何将字符串的每个字母移动给定数量的字母?

ruby-on-rails - ruby 版本的自动切换非交互式 shell

python - 如何检查一行是否是 python 中的有效函数调用?

java - 使用 java 字符串操作删除查询参数

c# - 在 C# 中检查一个字符串是半角还是全角

c - 错误 : no include path in which to search for stdio. h

linux - 已安装的 samba 共享 - 如何检查它是否在线