Вы пытаетесь определить переменную массива, но используете формат строки:
## This will define a string variable
$ MEDIUM_PERMISSIONS_BIN=/bin/{ls,rm,bash,nano,mkdir,kill,ln,ps,grep,sed}
$ echo $MEDIUM_PERMISSIONS_BIN
/bin/{ls,rm,bash,nano,mkdir,kill,ln,ps,grep,sed}
## The parentheses tell the shell this is an array
$ MEDIUM_PERMISSIONS_BIN=(/bin/{ls,rm,bash,nano,mkdir,kill,ln,ps,grep,sed})
$ echo $MEDIUM_PERMISSIONS_BIN ## the 1st element of the array
/bin/ls
$ echo ${MEDIUM_PERMISSIONS_BIN[@]} ## the entire array
/bin/ls /bin/rm /bin/bash /bin/nano /bin/mkdir /bin/kill /bin/ln /bin/ps /bin/grep /bin/sed
Так что просто измените файл конфигурации на:
MEDIUM_PERMISSIONS_BIN=(/bin/{ls,rm,bash,nano,mkdir,kill,ln,ps,grep,sed})
MEDIUM_PERMISSIONS_USR_BIN=(/usr/bin/{vim,touch,java,python,gcc,awk,make})
MEDIUM_ENVIROMENT_LIFESPAN=midnight
MEDIUM_PERSISTENT_HOME=true
Затем в своем скрипте используйте "${MEDIUM_PERMISSIONS_BIN[@]}"
.
Это не имеет ничего общего с подстановкой, это стандартное условие оболочки if
. [
— это встроенная оболочка (, а также внешняя команда ), используемая для тестов. То, что вы написали, эквивалентно этому:
if [ ! -d ~/.ssh ];
then
mkdir ~/.ssh
fi
Как объяснено вhelp [
(в bash):
$ help [
[: [ arg... ]
Evaluate conditional expression.
This is a synonym for the "test" builtin, but the last argument must
be a literal `]', to match the opening `['.
Здесь мы используем тест -d
, чтобы проверить, является ли ~/.ssh
каталогом. Вы можете снова увидеть различные варианты теста с помощьюhelp test
(в bash ). Здесь мы используем эти два:
$ help test | grep -E -- '^ *!|-d'
-d FILE True if file is a directory.
! EXPR True if expr is false.
Это означает, что [ ! -d ~/.ssh ]
будет истинным, если ~/.ssh
не является каталогом.
Теперь, когда мы знаем, что [
— это команда, которую может запускать оболочка, ее можно рассматривать как другие команды. Синтаксис command && otherCommand
также является стандартным и означает «запускать otherCommand
, только если command
был успешным». Итак, здесь вы говорите: «Создайте каталог ~/.ssh
, если он еще не существует :
[ ! -d ~/.ssh ] && mkdir ~/.ssh;
--------------- -- ------------
| | |=======> "otherCommand"
| |================> logical AND
|=========================> "if ~/.ssh is not a directory" (command)