2017-03-10 74 views
2

我正在寻找从变量末尾删除'/',以便我可以检查一个文件是否是符号链接到目录。我已经尝试了几乎所有我能想到的或在网上找到的方法,有没有我失踪的东西?从变量末尾删除'/' - bash

如果我检查一个文件是否是符号链接,并且结尾是'/',它将它视为一个目录。这可以通过运行来检查:

if [ -L symtest/ ] ; then echo "symlink"; fi 

其中symtest是目录的符号链接。以上输出什么也没有。

当我删除了“/”,它工作正常,并输出“符号链接”:

if [ -L symtest ] ; then echo "symlink"; fi 

我的问题是,有没有办法,当它作为A的传递,从名称中删除“/”变量的功能?

的功能将类似于:

function is_it_a_symlink() { 
    if [ -L $1 ] ; then 
     echo "This file is a symlink!" 
    else 
     echo "This file is not a symlink!" 
    fi 
} 

在此先感谢。

+1

注意POSIX的[路径解析](http://pubs.opengroup.org/ onlinepubs/9699919799/basedefs/V1_chap04.html#tag_04_13)规则要求您遵守的行为。 –

+1

@Alexander,请避免将ABS作为一种资源 - 它具有展示不良行为的长期声誉。 (使用免费的'function'关键字 - 它破坏了与POSIX sh的兼容性,但不增加标准化函数声明语法的值 - 就是onesuch)。 –

+1

@亚历山大,......实际上,在您链接的特定页面中还存在更严重的不良做法。 'directorys = $ @'失去边界信息 - 在使用它之后,无法区分'./yourscript“foo bar”“baz qux”'和'./yourscript foo bar baz qux'; 'linkchk'函数缺少引号(需要是“$ 1”/ *'和'linkchk“$ element”')等等。 –

回答

3

POSIX-LY,使用参数扩展摆脱过去/的:

${parameter%/} 

所以,你的情况:

[ -L "${1%/}" ] 

外部工具,sed

sed 's_/$__' <<<"$1" 

所以:

[ -L "$(sed 's_/$__' <<<"$1")" ] 

同样,awk

awk '{sub("/$", "")} 1' <<<"$1" 

所以:

[ -L "$(awk '{sub("/$", "")} 1' <<<"$1")" ] 
+0

完美的作品!事实上,我之前尝试过,没有引号。谢谢! –

+0

为了安全起见,您应该删除* all * trailing'/';不要以为只有一个。 '$ {1 %% /}' – chepner

+1

@chepner,...这有效吗?我认为必须使用extglob来匹配那里的序列。其实,它看起来像一个人;因此,在'shopt -s extglob'之后''{1 %% +(/)}'。 –