给定 tcsh 中的这个变量:
set i = ~/foo/bar.c
我怎样才能得到目录部分$i
?
~/foo
如果您的系统提供了“dirname”命令,您可以:
set i = `dirname ~/foo/bar.c`
echo $i
注意变量名前面缺少的 $。不过,这个解决方案与 shell 无关。
我在这里等待答案时发现这样做的方式:
set i = ~/foo/bar.c
echo $i:h
结果:
~/foo
这是与上面不同的东西:
在 tcsh 中可用,但其他 shell 很少 AFAIK
> set i = ~/foo/bar.c
> echo ${i:t}
bar.c
> echo ${i:h}
/home/erflungued/foo
完全而言,获取文件名是使用 basename 命令完成的:
set j = `basename ~/foo/bar.c`
echo $j
使用dirname
命令,例如:
set i = `dirname "~/foo/bar.c"`
注意路径周围的引号。将它们包括在内很重要。如果跳过引号,dirname
包含空格的路径将失败。请注意,~/
表达式在执行之前进行评估dirname
,因此如果不使用引号并且主路径包含空格,即使这样简单的示例也可能会失败。
当然,同样的问题也适用于所有其他命令,最好始终用引号将命令的参数括起来。
echo $i | awk -F"/" '{$NF="";print}' OFS="/"
dirname "$i"
确实使用,而不是${i:h}
.
$i
如果仅包含文件名(无路径),则后者不会产生预期的结果,而在这种情况下会dirname
正确返回当前目录.
。
> set i = bar.c
> echo ${i:h}
bar.c
> dirname "$i"
.