Có thể tham khảo các chỉ số trong $@
? Tôi không thể tìm thấy bất kỳ tài liệu tham khảo nào để sử dụng như bất kỳ nơi nào sau đây trong wiki của GrayCat và Hướng dẫn về kịch bản nâng cao và những người khác chỉ định điều này cho một biến khác trước khi sửa đổi điều đó.
$ echo ${@[0]}
-bash: ${@[0]}: bad substitution
Mục tiêu là DRY : Đối số đầu tiên được sử dụng cho một thứ và phần còn lại cho một thứ khác và tôi muốn tránh sao chép mã để chuẩn hóa, $@
mảng hoặc để tạo một hàm riêng cho điều này (mặc dù tại đây điểm có lẽ là cách dễ nhất).
Làm rõ: Đối tượng là sửa đổi các giá trị của độ dài biến $@
để làm cho mã dễ gỡ lỗi hơn. Phiên bản hiện tại hơi quá hack theo ý thích của tôi, mặc dù nó hoạt động ngay cả đối với những con đường kỳ quái như
$'--$`\! *@ \a\b\e\E\f\r\t\v\\\"\' \n'
Cập nhật : Có vẻ như điều này là không thể. Mã hiện sử dụng cả mã và sao chép dữ liệu, nhưng ít nhất nó hoạt động:
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 tìm đến bất kỳ ai có thể thoát khỏi sự trùng lặp mã để thu gọn các dấu gạch chéo hoặc sao chép dữ liệu để giữ $1
và các tham số khác, hoặc cả hai, trong khi giữ mã ở kích thước hợp lý và thành công trong tất cả các thử nghiệm đơn vị:
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