Проверка существования подкаталога с помощью glob в скрипте

Эти данные хранятся в PMU _ИМЯ, просто введите:

cat /sys/devices/cpu/caps/pmu_name
haswell
6
27.05.2021, 21:22
2 ответа

Используйте массив и проверьте, является ли первый элемент (т. е. [0] в bash, [1] в zsh )массива каталогом. например. вbash:

# the trailing slash in "$HOME"/.gem/ruby/*/bin/ ensures that
# the glob matches only directories.
rubygemdirs=( "$HOME"/.gem/ruby/*/bin/ )

if [ -d "${rubygemdirs[0]}" ] ; then
   echo "At least one ruby gem dir exists"
else
   echo "No ruby gem dirs were found"
fi

Чтобы работать как в zsh, так и в bash, вам нужно сначала выяснить, какая оболочка запущена в данный момент. Это скажет вам, является ли первый индекс массива 0или 1. Это также определит, нужно ли вам использовать (N)с glob, чтобы указать zsh НЕ выходить, если нет совпадений для glob (zsh завершит работу по умолчанию при ошибках сопоставления glob ).

(в этот момент должно стать очевидным, что написание скрипта для надежной работы в как в bash, так и в zsh, вероятно, принесет больше проблем, чем пользы)

if [ -n "$BASH_VERSION" ] ; then
   first_idx=0
   rubygemdirs=( "$HOME"/.gem/ruby/*/bin/ )
elif [ -n "$ZSH_VERSION"  ] ; then
   first_idx=1
   emulate sh
   rubygemdirs=( "$HOME"/.gem/ruby/*/bin/ )
   emulate zsh
fi

if [ -d "${rubygemdirs[$first_idx]}" ] ; then
...

При необходимости вы также можете выполнить итерацию по массиву, чтобы проверить, соответствует ли элемент определенной версии. например.

for d in "${rubygemdirs[@]}" ; do
  [[ $d =~ /2\.6\.0/ ]] && echo found gem dir for ruby 2.6.0
done

Обратите внимание, :/в регулярном выражении — это буквальные -косые черты. Они не отмечают начало и конец регулярного выражения, как в sed.

7
28.07.2021, 11:28

Специально для этого случая

Не думаю, что имеет смысл искать какой-либо каталог. Какой смысл использовать каталог, который не соответствует установленной версии Ruby? А что, если пользователь настроил другой каталог в ~/.gemrc?

Я не очень хорошо знаком с Ruby, но думаю, что правильным решением будет взять первую запись в gempath.

ruby_gem_home=$(gem environment gempath | sed 's/:.*//')
if [ -z "$ruby_gem_home" ]; then unset ruby_gem_home; fi

В зш

function set_ruby_gem_home {
  emulate -LR zsh
  local dirs
  dirs=($HOME/.gem/ruby/*/bin(NnOn))
  if (($#dirs == 0)); then
    unset ruby_gem_home
  else
    ruby_gem_home=$dirs[0]
  fi
}

Квалификатор globNгарантирует, что результатом будет пустой массив, а не ошибка, если совпадений нет. Квалификаторы glob nи Onсортируют список по убыванию номеров версий; настройте это, чтобы выбрать другой элемент, когда есть несколько совпадений.

В баш:

function set_ruby_gem_home {
  local dirs
  dirs=(~/.gem/ruby/*/bin(NnOn))
  if (($#dirs == 0)); then
    unset ruby_gem_home
  else
    ruby_gem_home=$dirs[0]
  fi
}

В баш

function set_ruby_gem_home {
  local dirs restore_options
  restore_options=$(setopt +o)
  shopt -s nullglob
  dirs=(~/.gem/ruby/*/bin)
  if (($#dirs == 0)); then
    unset ruby_gem_home
  else
    ruby_gem_home=${dirs[${#dirs[@]}-1]}
  fi
  eval "$restore_options"
}

Здесь я беру последний элемент массива, который часто, но не всегда, самая последняя версия:10сортируется перед 9.

7
28.07.2021, 11:28

Теги

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