我正在尝试编写一个带有参数基本名称的脚本,然后检查该参数中是否有扩展名。如果有,则打印扩展名。
这是我的代码:
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"}
这减少了我对基名的论证,谢谢大家。
答案 0 :(得分:12)
首先,你的语法是错误的:
file=$( basename "$1" )
其次,这是获取文件名(最后)扩展名的正确表达式:
ext=${file##*.}
答案 1 :(得分:8)
如果要为变量分配命令的输出,则必须使用后引号或使用特殊括号引用来执行它:
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"
希望这有助于=)