给定如下文件名:

/the/path/foo.txt
bar.txt

我希望得到:

foo
bar

为什么这样不行?

#!/bin/bash

fullfile=$1
fname=$(basename $fullfile)
fbname=${fname%.*}
echo $fbname

正确的方法是什么?

推荐答案

您不必调用外部basename命令.相反,您可以使用以下命令:

$ s=/the/path/foo.txt
$ echo "${s##*/}"
foo.txt
$ s=${s##*/}
$ echo "${s%.txt}"
foo
$ echo "${s%.*}"
foo

请注意,该解决方案应适用于所有最近(post 2004)POSIX兼容的shell (例如bashdashksh等).

资料来源:Shell Command Language 2.6.2 Parameter Expansion

更多关于bash字符串操作的信息:http://tldp.org/LDP/LG/issue18/bash.html

Linux相关问答推荐

BASH-SCRIPT-在特定行合并两个文件

shell中两个日期的天数差异

Docker 默认使用交换文件吗?

将(覆盖)文件移动到不同位置的同名文件夹中

如果列小于 X,linux 合并行

erlang 格式的 utf8 变为 \x(反斜杠 x)ascii 编码

使用 AWK 过滤 Linux 输出

如何在 Linux 上使用 -grep 构建过滤间隔的命令

std::system 使用什么Shell?

如果 bash 中已经存在文件名,则创建新文件但添加数字

模拟器在内核映像文件中找不到Linux 版本字符串

grep 时间命令输出

如何以另一个用户的身份使用 sudo 在 bash 子shell 中执行一系列命令?

zsh/bash 上不区分大小写的 Glob

Docker Volume 没有挂载任何文件

在 Emacs 中匹配括号的命令是什么?

如何在 Linux 中使用单行命令获取 Java 版本

Bash:在文件中的特定位置插入一行

如何在 IE 中使用 Linux 进行测试

如何在 UNIX 中将字符串转换为整数