9

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

这是我的代码:

file=basename $1
ext=${file%*}
echo ${file#"$stub"}
echo $basename $1

我正在回显最终的 $basename $1 以检查 basename 的输出是什么。

一些测试显示:

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 都没有工作。我知道这是一个语法错误,所以有人可以解释我做错了什么吗?

编辑:

我现在解决了我的问题:

file=$(basename "$1" )
stub=${file%.*}
echo ${file#"$stub"}

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

4

2 回答 2

15

首先,您的语法错误:

file=$( basename "$1" )

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

ext=${file##*.}
于 2012-10-11T16:57:17.670 回答
9

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

file=`basename "$1"`
file=$(basename "$1")

要删除文件名的扩展名,您应该这样做

ext=${file#*.}

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

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

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

echo basename $1

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

echo $(basename "$1")
echo "$file"
basename "$1"

希望这会有所帮助=)

于 2012-10-11T17:08:26.473 回答