首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Bash basename语法

Bash basename语法
EN

Stack Overflow用户
提问于 2012-10-12 00:50:54
回答 2查看 38.6K关注 0票数 9

我正在尝试编写一个脚本,它接受参数的基名称,然后检查该参数中是否有扩展名。如果有,它会打印扩展名。

下面是我的代码:

代码语言:javascript
复制
file=basename $1
ext=${file%*}
echo ${file#"$stub"}
echo $basename $1

我回显最后的$basename $1,以检查basename的输出是什么。

一些测试显示:

代码语言:javascript
复制
testfile.sh one.two
./testfile: line 2: one.two: command not found
one.two

testfile.sh ../tester
./testfile: line 2: ../tester: No such file or directory
../tester

因此,$basename $1都不起作用。我知道这是一个语法错误,所以有人能解释一下我做错了什么吗?

编辑:

我现在已经解决了我的问题:

代码语言:javascript
复制
file=$(basename "$1" )
stub=${file%.*}
echo ${file#"$stub"}

这将我的参数简化为一个基本名称,谢谢大家。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-10-12 00:57:18

首先,你的语法是错误的:

代码语言:javascript
复制
file=$( basename "$1" )

其次,这是获得文件名(最后一个)扩展名的正确表达式:

代码语言:javascript
复制
ext=${file##*.}
票数 15
EN

Stack Overflow用户

发布于 2012-10-12 01:08:26

如果要将命令的输出赋给变量,则必须执行该命令,使用反引号或使用特殊的圆括号引号:

代码语言:javascript
复制
file=`basename "$1"`
file=$(basename "$1")

要删除文件扩展名,应执行以下操作

代码语言:javascript
复制
ext=${file#*.}

这将获得$file的值,然后删除该句点之前的所有内容(这就是为什么它是必要的)。如果您的文件名包含句点,那么您应该使用ext=${file##*.},其中##告诉bash删除匹配的最长字符串,而不是最短字符串,因此它将删除直到最后一个句点,而不是第一个句点。

你的echo $basename $1很奇怪。它告诉bash打印一个名为$basename的变量的值和变量$1的值,这是脚本(或函数)的第一个参数。

如果要打印正在尝试执行的命令,请执行以下操作:

代码语言:javascript
复制
echo basename $1

如果您尝试打印命令的输出,可以执行以下操作之一:

代码语言:javascript
复制
echo $(basename "$1")
echo "$file"
basename "$1"

希望这会有帮助=)

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12844631

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档