Создание Списка меню и Выполнение Задачи

APPCLASSPATH=$CLASSPATH:$({ \
    \ls -1 "$VOLTDB_VOLTDB"/voltdb-*.jar; \
    \ls -1 "$VOLTDB_LIB"/*.jar; \
    \ls -1 "$VOLTDB_LIB"/extension/*.jar; \
} 2> /dev/null | paste -sd ':' - )

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

ls команды, названные с существующими именами файлов как аргументы, перечисляют свои аргументы, один на строку. Опция -1 не имеет никакого эффекта начиная с вывода ls идет в канал а не в терминал. Если ls получает аргумент, который не является названием существующего файла, оно ничего не отображает на своем стандартном выводе и отображает ошибку вместо этого. Ошибки от ls команды не перенаправляются к нигде 2> /dev/null. Существует две причины почему ls мог бы получить аргумент, который не является файлом: если одна из переменных не обращается к существующему, читаемому каталогу, или если нет никакого файла, соответствующего подстановочному шаблону. В любом случае шаблон передается нерасширенный до ls.

Обратные косые черты в конце строк заставляют оболочку игнорировать следующую новую строку. Ни один из них не полезен здесь, с тех пор в каждой точке, где там используются, оболочка ожидает дополнительную новую строку.

Фигурные скобки {…} группируют команды. Составная команда { \ls …; \ls …; \ls … ; } передается по каналу в paste и перенаправили его ошибки к /dev/null.

paste управляйте присоединяется ко всем входным строкам с a : промежуточный. Это эквивалентно tr '\n' : за исключением того, что это не помещает a : в конце.

Замена команды $(…) вызывает вывод paste быть интерполированным в APPCLASSPATH, после значения CLASSPATH переменная с двоеточием для разделения этих двух частей.

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

APPCLASSPATH=$CLASSPATH:$(
  \ls "$VOLTDB_VOLTDB"/voltdb-*.jar "$VOLTDB_LIB"/*.jar "$VOLTDB_LIB"/extension/*.jar |
  tr '\n' :) 2>/dev/null
APPCLASSPATH=${APPCLASSPATH%:}
3
15.11.2014, 09:31
2 ответа
[

] вы можете сделать это, используя постоянное истинное состояние:[

] [
while [ 1 -eq 1 ]  # or while [ true ] ( as glenn said)
do
 select opt in "${options[@]}"
 do
 case $opt in
     "Create Group")
         echo "You chose Create Group 1"
         ;;
     "Delete Group")
         echo "You chose to Delete Group"
         ;;
     "Create User")
         echo "You chose to Create User"
         ;;
     "Delete User")
         echo "You choose to Delete User"
         ;;
     "Quit")
         break
         ;;
     *) echo invalid option;;
  esac
 done
done
]
1
27.01.2020, 21:28
[

] я предполагаю, что вы хотите каждый раз отображать меню. Попробуйте так:[

] [
quit=false
until $quit; do
    select opt in "${options[@]}"; do
        case $opt in
            "Create Group")
                echo "You chose Create Group 1"
                break
                ;;
            "Delete Group")
                echo "You chose to Delete Group"
                break
                ;;
            "Create User")
                echo "You chose to Create User"
                break
                ;;
            "Delete User")
                echo "You choose to Delete User"
                break
                ;;
            "Quit")
                quit=true
                break
                ;;
            *) echo invalid option;;
        esac
    done
done
]
1
27.01.2020, 21:28

Теги

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