我正在编写一个脚本来删除目录中的所有文件以进行练习。我在变量周围使用引号,但我仍然收到以下错误:
/usr/local/bin/deleteall: line 6: [: too many arguments
/usr/local/bin/deleteall: line 11: [: too many arguments
这是我的代码:
#!/bin/bash
#Deletes all files in the current directory
read -p "You are about to delete all files in $(pwd). Are you sure you want to do this? y/n" yn
echo $yn
if [ [ "$yn" = "y" ] -o [ "$yn" = "Y" ] ] ; then
for i in `ls`; do
rm $i
done
exit;
elif [ [ "$yn" = "n" ] -o [ "$yn" = "N" ] ] ; then
exit;
else
read -p "Please enter y (yes) or n (no)"
exit;
fi
这是整个输出:
You are about to delete all files in <my dir>. Are you sure you want to do this? y/nn
n
/usr/local/bin/deleteall: line 6: [: too many arguments
/usr/local/bin/deleteall: line 11: [: too many arguments
Please enter y (yes) or n (no)n
我做错了什么?
答案 0 :(得分:5)
此行似乎有问题:
if [ [ "$yn" = "y" ] -o [ "$yn" = "Y" ] ] ; then
您可以将其替换为:
if [[ "$yn" == [yY] ]]; then
PS:对您检查n or N
的行执行相同操作。
答案 1 :(得分:2)
您无法嵌套[]
。它实际上是将嵌套括号解释为参数,并打印出错误太多的错误。
这会起作用
if [ "$yn" = "y" -o "$yn" = "Y" ]; then
另一种使用双括号和相同逻辑的替代语法
if [[ $yn == "y" || $yn == "Y" ]]; then
另外
for i in `ls`; do
rm $i
done
应该是
for i in *; do
[ -f "$i" ] && rm $i
done
所以它只会尝试删除常规文件(除非你覆盖rm
,否则你会得到dirs的错误,你可以决定你想用符号链接做什么)。 ls
只是无关紧要。
答案 2 :(得分:0)
这就是你想要的:
read -p "Are you sure? " -n 1 -r
echo # (optional) move to a new line
if [[ $REPLY =~ ^[Yy]$ ]]
then
for i in `ls`; do
rm -rf $i
done
fi
if [[ $REPLY =~ ^[Nn]$ ]]
then
#do what you want
done
fi