是否可以引用中的索引$@
?我在GrayCat的wiki中的任何地方都找不到像下面这样的引用,而Advanced Scripting Guide和其他脚本则在修改它之前将其分配给其他变量。
$ echo ${@[0]}
-bash: ${@[0]}: bad substitution
目标是DRY:第一个参数用于一件事情,其余参数用于其他事情,我想避免重复代码以标准化,$@
数组或为此创建单独的函数(尽管在此情况下)指出这可能是最简单的出路)。
澄清:目的是修改可变长度 的值,$@
以使代码更易于调试。尽管我什至喜欢像这样的怪异路径,但当前的版本还是有点过于hacky
$'--$`\! *@ \a\b\e\E\f\r\t\v\\\"\' \n'
更新:看来这是不可能的。该代码现在同时使用代码和数据重复,但是至少可以使用:
path_common()
{
# Get the deepest common path.
local common_path="$(echo -n "${1:-}x" | tr -s '/')"
common_path="${common_path%x}"
shift # $1 is obviously part of $1
local path
while [ -n "${1+defined}" ]
do
path="$(echo -n "${1}x" | tr -s '/')"
path="${path%x}"
if [[ "${path%/}/" = "${common_path%/}/"* ]]
then
shift
else
new_common_path="${common_path%/*}"
[ "$new_common_path" = "$common_path" ] && return 1 # Dead end
common_path="$new_common_path"
fi
done
printf %s "$common_path"
}
任何人都可以摆脱代码重复以折叠重复的斜杠或保留的数据重复$1
和其他参数,或同时保留这两个参数,同时保持代码的合理大小并成功进行所有单元测试:
test "$(path_common /a/b/c/d /a/b/e/f; echo x)" = /a/bx
test "$(path_common /long/names/foo /long/names/bar; echo x)" = /long/namesx
test "$(path_common / /a/b/c; echo x)" = /x
test "$(path_common a/b/c/d a/b/e/f ; echo x)" = a/bx
test "$(path_common ./a/b/c/d ./a/b/e/f; echo x)" = ./a/bx
test "$(path_common $'\n/\n/\n' $'\n/\n'; echo x)" = $'\n/\n'x
test "$(path_common --/-- --; echo x)" = '--x'
test "$(path_common '' ''; echo x)" = x
test "$(path_common /foo/bar ''; echo x)" = x
test "$(path_common /foo /fo; echo x)" = x
test "$(path_common $'--$`\! *@ \a\b\e\E\f\r\t\v\\\"\' \n' $'--$`\! *@ \a\b\e\E\f\r\t\v\\\"\' \n'; echo x)" = $'--$`\! *@ \a\b\e\E\f\r\t\v\\\"\' \n'x
test "$(path_common /foo/bar //foo//bar//baz; echo x)" = /foo/barx
test "$(path_common foo foo; echo x)" = foox
test "$(path_common /fo /foo; echo x)" = x