bash для l oop, чтобы проверить, существует ли каталог - PullRequest
0 голосов
/ 25 апреля 2020

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

Я пытаюсь создать for для l oop, чтобы проверить, допустим ли пользовательский ввод (каталоги, для которых будет выполнено резервное копирование) в массиве. Если ввод действителен, его следует использовать. Если нет, его следует перезаписать значением по умолчанию /home/$USER.

echo "Please enter absolute path of directory for backup. Default is "/home/$USER
echo "You can choose multiple directories. Press CTRL-D to start backup."
read USER_DIR

# save user input into array
while read line
do
    USER_DIR=("${USER_DIR[@]}" $line)
done

# check if user input in array is valid (directory exists)
for i in ${USER_DIR[@]}
do
    if [[ -d "${USER_DIR[$i]}" ]]; then
        # directory exists
        ${USER_DIR[$i]}=${USER_DIR[$i]}
    else
        # directory does not exist
        ${USER_DIR[$i]}="/home/$USER"
    fi
done

# show content of array (check if for loop works)
echo "Backups of the following directories will be done:"
for i in ${USER_DIR[@]}; do echo $i; done

Это вывод, который я получаю (/home/michael/Downloads - это каталог, notadirectory - нет) output bash for loop

Спасибо за ваше время.

1 Ответ

1 голос
/ 25 апреля 2020

В вашем коде ${USER_DIR[$i]}=${USER_DIR[$i]} не удается.
Вы должны удалить первый $, когда хотите что-то назначить.
Ваша ошибка ранее.
Вы хотите проверить каталог "${USER_DIR[0]}", но вы тестируете "${USER_DIR[$i]}", а это

${USER_DIR["/home/michael/Downloads"]}

Попробуйте

for i in ${#USER_DIR[@]}

или

for ((i=0; i<${#USER_DIR[@]}; i++))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...