Наборы инструментов для разработчиков ниже версии 6 перемещены. Чтобы включить их:
yum -y install centos-release-scl
yum-config-manager --enable centos-sclo-rh-testing
В :
есть любой произвольный символ:
Вы можете использовать:
parts=(${(s/:/)str})
Также поддерживаются некоторые распространенные пары символов, например:
parts=(${(s[:])str})
Если вы собираетесь использовать флаг @
для сохранения пустых элементов, вам нужно цитата:
parts=("${(@s[:])str}")
В противном случае @
не имеет значения.
Если это для обработки таких переменных, как $PATH
/ $LD_LIBRARY_PATH
... см. также typeset -T
, который связывает переменную массива со скалярной переменной:
$ typeset -T str str_array
$ str='a::b'
$ typeset -p str
typeset -T str str_array=( a '' b )
zsh
привязывает $path
к $PATH
по умолчанию (, как в csh
/tcsh
).
баш
parts=(${str//:/ })
Неверно, так как применяется split+glob после замены :
на SPC.
Вы бы хотели:
IFS=: # split on : instead of default SPC TAB NL
set -o noglob # disable glob
parts=( $str"" ) # split+glob (leave expansion unquoted), preserve trailing
# empty part.
Этот код также будет работать в zsh
, если он находится в режиме эмуляции sh
или ksh
. Если ваша цель — написать код, совместимый как с bash
, так и с zsh
, вы можете написать его с использованием синтаксиса ksh и убедиться, что zsh
помещен в эмуляцию ksh
(, возможно, только локально для какой-либо функции. )при интерпретации.
Чтобы проверить, является ли оболочка bash
или zsh
,вы бы проверили наличие переменных $BASH_VERSION
/ $BASH_VERSINFO
или $ZSH_VERSION
.
split() { # args: string delimiter result_var
if
[ -n "$ZSH_VERSION" ] &&
autoload is-at-least &&
is-at-least 5.0.8 # for ps:$var:
then
eval $3'=("${(@ps:$2:)1}")'
elif
[ "$BASH_VERSINFO" -gt 4 ] || {
[ "$BASH_VERSINFO" -eq 4 ] && [ "${BASH_VERSINFO[1]}" -ge 4 ]
# 4.4+ required for "local -"
}
then
local - IFS="$2"
set -o noglob
eval "$3"'=( $1"" )'
else
echo >&2 "Your shell is not supported"
exit 1
fi
}
split "$str" : parts