Ale*_*ero 19 bash shell symlink if-statement
我正在创建一个bash脚本来检查符号链接目标是否与特定路径匹配,因此,如果它不匹配,脚本将删除符号链接.我尝试过readlink:
#!/bin/env bash
target_path=$HOME/Code/slate/.slate.js
if [ `readlink $HOME/.slate.js` == "$target_path" ]; then
rm -rf "$HOME/.slate.js"
fi
Run Code Online (Sandbox Code Playgroud)
但它不起作用:
%source test
test:5: = not found
Run Code Online (Sandbox Code Playgroud)
Rad*_*anu 23
比较字符串时,您应该使用双引号(是的,输出readlink $HOME/.slate.js是字符串):
[ "$(readlink $HOME/.slate.js)" = "$target_path" ]
Run Code Online (Sandbox Code Playgroud)
如果$target_path与链接文本不完全匹配,您可以检查它们实际上是等价的(无论名称如何).但由于硬链接更可取,您可能也想检查一下这种情况(见下文).
更通用的解决方案是:
[ "$(readlink $HOME/.slate.js)" -ef "$target_path" ]
Run Code Online (Sandbox Code Playgroud)
或者,如您的示例所示:
target_path=$HOME/Code/slate/.slate.js
if [ "`readlink $HOME/.slate.js`" -ef "$target_path" ]; then
rm -rf "$HOME/.slate.js"
fi
Run Code Online (Sandbox Code Playgroud)
但这一切都假设你$HOME/.slate.js是一个象征性的联系.如果它是一个硬链接(如果可能的话,这是更可取的),那么它更简单:
… [ "$HOME/.slate.js" -ef "$target_path" ] …
Run Code Online (Sandbox Code Playgroud)
也许类似(检查它是否是符号链接,如果是这样,然后检查该链接是否与目标匹配;否则检查文件是否相同 - 硬链接或实际上是同一文件):
… [ \( -L "$HOME/.slate.js" -a "`readlink $HOME/.slate.js`" -ef "$target_path" \) \
-o \( "$HOME/.slate.js" -ef "$target_path" \) ] …
Run Code Online (Sandbox Code Playgroud)
您还应该检查文件实际上是否是同一个文件(而不是硬链接),否则您将删除该文件并且仅复制.