我已经开始使用 git 存储库,其中包含大量应假定为只读的内容。所以,每次我抛出一个新分支时:
git checkout -b newBranch
它后面应该跟着命令
git update-index --assume-unchanged LARGE_READONLY_DIRECTORY
我认为这将是一个绝佳的机会来尝试我刚刚起步的 bash 技能,因此我在 shell 中需要做的就是第一行,它会执行第一行,然后是第二行,而我不记得这样做(我赢了) 't)。
我想我想要做的是在 .bashrc 中有一个函数来检查第一个参数是否为“checkout”,第二个参数是否为“-b”。第一次检查很简单,但我不知道如何注意到 -b 的存在。
git() {
if [[ $1 == 'checkout' ]] && [[$2 == '-b']];
then echo 'yep!';
fi;
command git "$@";
}
当我执行此操作时,它抱怨[[-b: command not found
.据推测,这是一个选项,而不是一个论点,这一事实在这里很重要。谁能告诉我如何检查该参数是否存在,以便我知道执行后续命令?
答案1
[[
和之间需要有一个空格$2
。
因为 bash[[
不是语法,它是一个内置命令(或者准确地说是关键字)。 Bash 将[[
使用其所有参数执行,包括结束]]
.当[[
和之间没有空格时, $2
bash 将看不到关键字[[
,而是会看到这个东西:([[-b
扩展$2
为后-b
)。然后,Bash 将尝试将该字符串[[-b
作为命令执行,但会失败。请参阅help [[
获取更多信息。
出于同样的原因,您在结束前也需要一个空格]]
。
这是您的固定代码:
git() {
if [[ $1 == 'checkout' ]] && [[ $2 == '-b' ]];
then echo 'yep!';
fi;
command git "$@";
}
另请参阅bash 陷阱和bash 常见问题解答。 IMO 学习 bash 脚本的最佳方法...或者学习不做太多 bash 脚本的最佳方法。
答案2
[[
由于和之间没有空格$2
,因此解析不正确([[
直接跟随 的扩展$2
)。您需要在参数之间留有空格[[
:
[[ $2 == -b ]]