#!/bin/bash
echo "Enter the search string"
read str
for i in `ls -ltr | grep $str > filter123.txt ; awk '{ print $9 }' filter123.txt` ; do
if [ $i != "username_list.txt" || $i != "user_list.txt" ] ; then
else
rm $i
fi
done
我是 unix shell scritping 的初学者,我使用 grep 方法根据给定的字符串为删除文件创建上述文件。 当我执行上面的脚本文件时,它显示错误,例如"./rm_file.txt:第 10 行:意外标记'else'附近的语法错误"。请建议此脚本中的错误是什么。
您的代码存在几个问题:
-
不要解析
ls
的输出。尽管它可能在大部分时间都有效,但它会因某些文件名而中断,并且有更安全的替代方案。 -
将
filter123.txt
替换为另一个管道。 -
您可以否定条件的退出状态,这样就不需要
else
子句。 -
您的
if
条件始终为 true,因为任何文件名都不能等于两个选项之一。您可能打算使用&&
. -
||
和&&
在[ ... ]
内不可用。使用两个[ ... ]
命令或使用[[ ... ]]
。
解决上述问题:
for i in *$str*; do
if [[ $i != username_list.txt && $i = user_list.txt ]]; then
rm "$i"
fi
done
要将布尔运算符与 [
一起使用,您可以使用以下之一:
if [ "$i" != username_list.txt ] && [ "$i" != user_list.txt ] ; then ...
if [ "$i" != username_list.txt -a "$i" != user_list.txt; then ...
但在这种情况下,使用 case 语句可能更干净:
case "$i" in
username_list.txt|user_list.txt) : ;;
*) rm "$i";;
esac
在 then
和 else
之间什么都没有,如果你什么都不想做,你可以把:
放在那里
要删除当前控制器中名称中包含特定字符串的文件,您可以使用find
#!/bin/bash
read -p "Enter the search string: " str
# to exclude "username_list.txt" and "user_list.txt"
find . -maxdepth 1 -type f -name "*$str*" -a -not ( -name "username_list.txt" -o -name "user_list.txt" ) | xargs -I'{}' ls {}
使用 find
来完成:
find . -maxdepth 1 -type f -name "*$str*" ! -name username_list.txt ! -name user_list.txt -exec rm {} ;