İçindeki dizinlere atıfta bulunmak mümkün mü $@
? GrayCat'in wiki'sinde aşağıdaki gibi kullanmak için herhangi bir referans bulamıyorum ve Gelişmiş Komut Dosyası Kılavuzu ve diğerleri bunu değiştirmeden önce bunu farklı bir değişkene atar.
$ echo ${@[0]}
-bash: ${@[0]}: bad substitution
Amaç DRY : İlk argüman bir şey için kullanılır ve geri kalanı başka bir şey için kullanılır ve kodun normalleştirilmesi, $@
dizi veya bunun için ayrı bir işlev oluşturmak için çoğaltılmasından kaçınmak istiyorum. muhtemelen en kolay çıkış yolu).
Açıklama: Nesne değerlerini değiştirmek için olan değişken uzunluk $@
yapmak için kodu ayıklamak kolaylaştırır. Mevcut sürüm, benim gibi tuhaf yollar için bile çalışmasına rağmen benim beğenme için biraz fazla hacky
$'--$`\! *@ \a\b\e\E\f\r\t\v\\\"\' \n'
Güncelleme : Görünüşe göre bu mümkün değil. Kod artık hem kod hem de veri çoğaltma kullanıyor, ancak en azından çalışıyor:
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"
}
Bounty , kodu makul bir boyutta tutar ve tüm birim testlerini başarıyla gerçekleştirirken, çift eğik çizgileri veya tutulacak verilerin çoğaltılmasını veya diğer parametrelerin ya da her ikisini de çökertmek için kodun çoğaltılmasından kurtulabilen herkese gider :$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