创建一个存储路径并将其放入变量的数组

时间:2019-05-01 17:16:00

标签: arrays bash unix

我正在编写一个脚本,要求用户输入他们想要更改权限的文件名,如果在搜索中出现了一个以上的文件,并且如果用户想使用该文件,我会陷入困境多个文件,我该怎么办。

我已经设置了find命令并将其设置为将其存储在路径中。

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 :(得分:0)

除非您知道自己在做什么,否则不要覆盖$ 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

注意:我以前没有想到这一点,但是可以提供一个here-document而不是交互使用脚本:

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

*
EOF