При запуске моего нижеприведенного сценария из опции оболочки jenkins execute я получаю - [: 1 2 3 4 5: ожидалось целочисленное выражение , я тоже попытался использовать символ> без каких-либо удач, я не уверен, где именно я ошибся.

Любая помощь будет действительно полезной.

#!/bin/bash

declare -a folders
declare -a folders_req

db_ver=<the value which I got from my DB with trimmed leading & trailing spaces, like below> 
#db_ver=`echo $( get_value ) |sed -e 's/\-//g' | grep -oP '(?<=DESCRIPTION)(\s+)?([^ ]*)'  | sed -e 's/^[[:space:]]//g' | sed -e's/[[:space:]]*$//' | tr '\n' ' '| cut -d '/' -f2`

scripts_db_dir=`ls -td -- */ | head -1 | cut -d '/' -f1| sed -e 's/^[[:space:]]//g'`

cd ${scripts_db_dir}
folders=`ls -d */ | sed 's/\///g' | sed -e 's/^[[:space:]]//g' | sed -e's/[[:space:]]*$//' | tr '\n' ' '`

  for i in "${folders[@]}"; do

    if [ "${i}" -gt "${db_ver}" ]; then
       echo "inside loop: $i"
       folders_req+=("$i")
    fi
  done

  #echo "$i"
  #echo ${folders_req[@]}

Scripts_db_dir содержит каталог с именем вроде - 1 2 3 4 5

0
Goku 23 Апр 2019 в 12:55

2 ответа

Лучший ответ

Ваша folders переменная должна быть инициализирована как массив, а не как строка, например:

folders=($(ls -d */ | sed 's/\///g' | sed -e 's/^[[:space:]]//g' | sed -e's/[[:space:]]*$//' | tr '\n' ' '))
2
nullPointer 23 Апр 2019 в 10:09

Учитывая различные комментарии, касающиеся "разбора ls плохого", рассмотрите возможность использования вместо этого найти:

find * -maxdepth 1 -type d -name '[0-9]*' -print

Где:
-maxdepth 1 - ищет только текущий каталог, но не подкаталоги
-type d - ищет только каталоги
-name '[0-9]*' (или '[[:digit:]]*') - соответствует только элементам, состоящим из всех цифр
-print - просто распечатайте результаты

Таким образом:
folders=($(find * -maxdepth 1 -type d -name '[0-9]*' -print))
или просто:
for i in $(find * -maxdepth 1 -type d -name '[0-9]*' -print); do

1
Ian W 25 Апр 2019 в 10:03