сценарий оболочки (busybox) не работает должным образом в контейнере докеров

Запуск alpine на основе образа с busybox и ash:

/mnt/builddir/code/src/main/helm # busybox | head -1
BusyBox v1.31.1 () multi-call binary.

Я написал сценарий sh, который печатает имена файлов, только если они начинаются со значений префикса, но что-то с условием if не работает. Это мой сценарий:

for f in ./*
do
  echo ${f##*/}
  if ${f##*/} == 'values'*; then
      echo $f
  fi
done

выход:

/mnt/builddir/code/src/main/helm # ./script.sh
Chart.yaml
./script.sh: line 4: Chart.yaml: not found
script.sh
./script.sh: line 4: script.sh: not found
values-feature.yaml
./script.sh: line 4: values-feature.yaml: not found
values-int.yaml
./script.sh: line 4: values-int.yaml: not found
values-prod.yaml
./script.sh: line 4: values-prod.yaml: not found
values-stg.yaml
./script.sh: line 4: values-stg.yaml: not found
values.yaml
./script.sh: line 4: values.yaml: not found

до того, как я изменил код на приведенный выше, условие if выглядело так:

if [[ ${f##*/} == values* ]]
then
    ...

Но и это не работает.

Спасибо за ваши предложения...


person I.zv    schedule 14.04.2021    source источник
comment
Ваш вопрос противоречит сам себе: Вы помечаете его как bash, но в заголовке пишете sh. Для bash [[ ${f##*/} == values* ]] имело бы смысл; для sh явно нет. Кроме того, не работает должным образом и тоже не работает — это анекдотическое свидетельство, а не описание проблемы.   -  person user1934428    schedule 14.04.2021


Ответы (1)


В этом сценарии есть две очевидные проблемы: в строке if вы не вызываете test(1), а вместо этого пытаетесь запустить каждый файл напрямую; а оператор test(1) == выполняет только точное сравнение строк, а не сопоставление шаблонов или регулярных выражений.

Вы можете использовать оператор оболочки case для сопоставления переменной с глобусом:

case "$f" in
  */values*)
    echo "$f"
    ;;
esac

Но оператор оболочки for может выполнять итерацию по расширению глобуса, и в целом это будет более простая установка:

for f in values*; do
  echo "$f"
done

(Это совсем не относится к Docker, и я ожидаю, что вы получите очень похожие ошибки при запуске скрипта непосредственно на хосте. Возможно, вам будет намного проще разрабатывать и отлаживать скрипт, не используя Docker в качестве изолирующего слоя между вы и код, который вы пытаетесь исправить.)

person David Maze    schedule 14.04.2021
comment
в вашем первом примере вы закрываете скобки /values), но не открываете. Это специально? - person I.zv; 14.04.2021
comment
@I.zv, это синтаксис case, см. help case - person Jetchisel; 14.04.2021