Я пытаюсь написать функцию dirname в Bash, чтобы она не использовала никаких внешних команд.
function dirname() {
local path=$1
[[ $path =~ ^[^/]+$ ]] && dir=. || { # if path has no slashes, set dir to .
[[ $path =~ ^/+$ ]] && dir=/ || { # if path has only slashes, set dir to /
local IFS=/ dir_a i
read -ra dir_a <<< "$path" # read the components of path into an array
dir="${dir_a[0]}"
for ((i=1; i < ${#dir_a[@]}; i++)); do # strip out any repeating slashes
[[ ${dir_a[i]} ]] && dir="$dir/${dir_a[i]}" # append unless it is an empty element
done
}
}
[[ $dir ]] && printf '%s\n' "$dir" # print only if not empty
}
Чтобы удалить любые повторяющиеся /
из пути, мне пришлось использовать логику массива. Есть ли более простой способ сделать то же самое с параметром Bash Расширение? Я пытался, но, кажется, у меня не получается.
По сути, я хочу заменить все вхождения нескольких последовательных косых черт одной косой чертой каждый.
/
и далее. Например: если путь равенa//b//c///d
, это даст намa//b//c//
. - person codeforester   schedule 18.10.2017a//b//c///d
? Единственное, с чем я столкнулся, это преобразование компонентов пути Windows сdrive:\\a\\b\\c\\file.ext
в POSIXdrive:/a/b/c/file.ext
. Где вы можете создать путь, подобныйa//b//c///d
? ветер? Или это просто обычное упражнение раздеть несколько раз'//'
? - person David C. Rankin   schedule 18.10.2017$ dirname "//a///b////c/d//e.txt"
дает"//a///b////c/d"
. Откуда берется удаление нескольких косых черт? (или я такой толстый, что все еще скучаю по нему?) - person David C. Rankin   schedule 18.10.2017dirname
не удаляет эти косые черты. Не знаю, почему я так подумал. - person codeforester   schedule 19.10.2017