Создание массива, который хранит пути и помещает их в переменную - PullRequest
0 голосов
/ 01 мая 2019

Я пишу скрипт, в котором пользователя просят ввести имя файла, для которого он хочет изменить права доступа. Я застрял, если в поиске появляется более одного файла, и если пользователь хочет использовать несколько файлов, как мне поступить об этом.

Я настроил команду поиска и установил, что она будет сохранена в пути.

read -r QUESTION
if [ "$QUESTION" = 1 ];
then
    echo "What is the name of the file you want to make read only?"
    read -r FILENAME
    find ~/ -name "$FILENAME"
    PATH=$(find ~/ -name "$FILENAME")
    echo
    pwd
    /bin/chmod -v 400 "$PATH"
    fi
fi

echo

Ожидаемый вывод: пользователь сможет вводить несколько файлов, для которых он сможет изменять разрешения для всех этих файлов за один раз. Если они хотят изменить только 1 файл, и в результатах поиска появляется несколько файлов, они могут выбрать свой 1 файл.

1 Ответ

0 голосов
/ 02 мая 2019

Не перезаписывайте $ PATH, если не знаете, что делаете.Эта переменная используется для поиска исполняемых файлов.

$ echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games

Как сказал Гордон;вы должны поместить вывод find в массив вместо переменной.Обратите внимание на кавычки, иначе файлы с пробелами приведут к ошибкам.

ARRAY=("$(find . -name "my file.txt")")
for file in "${ARRAY[@]}"; do echo $file; done

Я позволил себе написать сценарий таким образом, что я думаю, что вы сможете изменить его в соответствии с вашими потребностями.Сценарий вроде как сам по себе, но не стесняйтесь задавать вопросы.Вам следует самостоятельно проверить некоторые ошибки ;-)

#! /bin/bash

IFS=$'\n'

FOUND=()
echo "Enter a blank filename to stop input"
while read -p "Enter a file name: " file; do
        [ ! -z "${file}" ] || break
        file_found=$(find ${HOME} -name ${file})
        if [ -z "${file_found}" ]; then
            echo "File '$file' not found"
            continue
        fi
        FOUND+=(${file_found})
done

if [ ${#FOUND[@]} -gt 1 ]; then

        echo "Multiple files found, make a choice."
        for ((index=0; index<${#FOUND[@]};index++)); do
                echo "  -> $index = ${FOUND[$index]}"
        done
        echo "  -> 0 1 .. n = Item 0, 1, .., n"
        echo "  -> * = Everything"
        echo "  -> Leave empty to abort"

        read -p "Choice(s): " CHOICE

        if [ -z "${CHOICE}" ]; then
                echo "Nothing chosen, aborting"
        elif [ "${CHOICE}" = "*" ]; then
                chmod -v 400 ${FOUND[@]}
        else
                FILES=()
                IFS=' '
                for choice in ${CHOICE}; do
                        FILES+=("${FOUND[$choice]}")
                done
                chmod -v 400 "${FILES[@]}"
        fi
elif [ ${#FOUND[@]} -eq 1 ]; then
        chmod -v 400 $FOUND
else
        echo "Not found"
        exit 1
fi

exit 0

Примечание: я не думал об этом раньше, но вместо интерактивного использования сценария можно предоставить здесь документ:

$ ./test.sh << EOF
file1.txt
file 2.txt

*
EOF
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...