Как разбить строку по символу ':' в bash/zsh?

Наборы инструментов для разработчиков ниже версии 6 перемещены. Чтобы включить их:

yum -y install centos-release-scl
yum-config-manager --enable centos-sclo-rh-testing
4
13.10.2020, 14:51
1 ответ

В :есть любой произвольный символ:

Вы можете использовать:

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
14
18.03.2021, 22:57

Теги

Похожие вопросы