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%:}
] вы можете сделать это, используя постоянное истинное состояние:[
] [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
] ] я предполагаю, что вы хотите каждый раз отображать меню. Попробуйте так:[
] [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
]