【发布时间】:2011-09-17 14:58:38
【问题描述】:
我正在尝试理解一个测试脚本,其中包括以下部分:
SCRIPT_PATH=${0%/*}
if [ "$0" != "$SCRIPT_PATH" ] && [ "$SCRIPT_PATH" != "" ]; then
cd $SCRIPT_PATH
fi
${0%/*} 代表什么?谢谢
【问题讨论】:
我正在尝试理解一个测试脚本,其中包括以下部分:
SCRIPT_PATH=${0%/*}
if [ "$0" != "$SCRIPT_PATH" ] && [ "$SCRIPT_PATH" != "" ]; then
cd $SCRIPT_PATH
fi
${0%/*} 代表什么?谢谢
【问题讨论】:
它被称为Parameter Expansion。看看this page 和网站的其余部分。
${0%/*} 所做的是,它在从末尾删除字符串/* 后缀后扩展包含在 参数 0(即调用脚本的路径)中的值。
所以,$0 与 ${0} 相同,就像任何其他参数一样,例如。 $1 你可以写成${1}。正如我所说的$0 是特殊的,因为它不是一个真正的 参数,它总是存在并代表脚本的名称。参数扩展在 { } -- 花括号内工作,% 是一种参数扩展。
%/* 匹配最后一次出现的 / 并删除该字符之后的任何内容(* 表示任何内容)。看看这个简单的例子:
$ var="foo/bar/baz"
$ echo "$var"
foo/bar/baz
$ echo "${var}"
foo/bar/baz
$ echo "${var%/*}"
foo/bar
【讨论】:
dirname($0)
dirname "$0" 一样工作,但它可能会导致问题。如果你这样调用脚本:bash script 然后${0/*} 不会给你路径,它会返回脚本名,或者如果你指定了完整路径 (/path/to/script) 它不返回任何内容,因此不能保证在所有情况下都能按预期工作。
${0%} 并登陆了这里,你已经向我说清楚了 :)