我正在编写一个脚本,要求用户输入他们想要更改权限的文件名,如果在搜索中出现了一个以上的文件,并且如果用户想使用该文件,我会陷入困境多个文件,我该怎么办。
我已经设置了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个文件。
答案 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