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