에서 색인을 참조 할 수 $@
있습니까? 나는 어떤 참조가 어디 다음과 같이 사용 찾을 수 없습니다 GrayCat의 위키 , 그리고 고급 스크립팅 가이드 와 다른 사람이 대신 것을 수정하기 전에 다른 변수에이를 할당합니다.
$ echo ${@[0]}
-bash: ${@[0]}: bad substitution
목표는 DRY입니다 . 첫 번째 인수는 한 가지에 사용되고 나머지는 다른 것에 사용되며, 정규화하기 위해 코드를 복제하거나 $@
배열을 만들거나 별도의 함수를 만드는 것을 피하고 싶습니다 (이것에도 불구하고 아마도 가장 쉬운 방법 일 것입니다).
설명 : 객체는 코드를 더 쉽게 디버깅 할 수 있도록 가변 길이 값을 수정하는 것이 었습니다. 현재 버전은 내가 좋아하는 것에 비해 너무 해킹이지만, 기이 한 경로에서도 작동합니다.$@
$'--$`\! *@ \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