2016-09-15 3 views
1

Я написал сценарий оболочки для создания каталога, если он не существует. Я могу создать новый каталог. Но когда я передаю существующее имя каталога, оператор elif не выполняется, вместо этого Created Directory печатает. Что я делаю неправильно?Скрипт оболочки для создания каталога

if [[ ! -e /test/{a,b,c}/$dirname ]]; then 
    mkdir "/test/{a,b,c}/$dirname" 
    echo "Created Directory" 
elif [[ ! -d /test/{a,b,c}/$dirname ]]; then 
    echo "$dirname already exists" 
fi 

Здесь test, a, b и c каталоги.

+1

** Почему ** Вам нужно знать, существуют ли они уже? Если вы используете 'mkdir -p', они создадут их только в том случае, если их еще нет, и вам не нужно запускать чек. –

+0

Если я передаю существующий каталог, сценарий должен также вызывать ошибку. Это то, что я пытаюсь выполнить –

+0

'mkdir -p"/test/{a, b, c}/$ dirname "|| printf ": каталог не существует и не может создать. \ n" "может быть? –

ответ

1

Фигурных скобки не является форма подстановки выполняется на некотируемом расширении. Следовательно, вы не можете положиться на for dir in $dirs: вам нужно либо использовать массив для хранения результатов расширения скобок, либо напрямую перебирать такие результаты.

Если вы хотите создать любые каталоги, только если ни один уже каталогов существуют:

# assign to an array 
dirs=(/test/{a,b,c}/"$dirname") 

# iterate over contents and check, failing if any exists 
for dir in "${dirs[@]}"; do 
    [[ -d "$dir" ]] && { echo "$dir already exists" >&2; exit 1; } 
done 

# if we reach here, none of them exist, so create all directories with one mkdir call. 
mkdir -- "${dirs[@]}" || exit # also, fail the script if mkdir fails 

С другой стороны, если это приемлемо принять частичное действие:

for dir in /test/{a,b,c}/"$dirname"; do 
    [[ -d "$dir" ]] && { echo "$dir already exists" >&2; exit 1; } 
    mkdir -- "$dir" 
done 
+0

Спасибо за ответ. Также для создания скрипта каталога предлагается ввести пароль sudo на терминал. Есть ли способ обойти это, используя ожидание программирования? –

+0

Да, но лучше переконфигурировать sudo, чтобы не запрашивать пароль вообще (с настройкой и валидацией, что делает это разрешение максимально приближенным).Например, вы можете разрешить только конкретному пользователю, который должен запускать этот скрипт, использовать sudo без пароля только для запуска скрипта - или вы могли бы использовать другой скрипт для sudo без пароля, который обрабатывает только части mkdir, с тщательной проверкой аргументов, переменные окружения (если ваш файл sudoers позволяет им пройти) & c, чтобы убедиться, что злоумышленник не может быть перекошен. –

+0

Спасибо за ответ. Есть ли способ сделать это, используя экспертную программу? –

1

Вы не можете пройти тест на нескольких серверах одновременно.

Вам нужно перебрать директории:

dirs=(/test/{a,b,c}/"$dirname") 
for dir in "${dirs[@]}"; do 
    if [[ ! -d $dir ]]; then 
     mkdir "$dir" 
     echo "Created Directory" 
    else 
     echo >&2 "$dir already exists" 
    fi 
done 
+0

Мне нужно проверить, существует ли каталог или нет. –

+0

Отредактированный пост –

+0

По-прежнему сталкивается с той же проблемой. –

Смежные вопросы