Unix 如果条件错误在循环内


#!/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'附近的语法错误"。请建议此脚本中的错误是什么。

您的代码存在几个问题:

  1. 不要解析 ls 的输出。尽管它可能在大部分时间都有效,但它会因某些文件名而中断,并且有更安全的替代方案。

  2. filter123.txt替换为另一个管道。

  3. 您可以否定条件的退出状态,这样就不需要else子句。

  4. 您的if条件始终为 true,因为任何文件名都不能等于两个选项之一。您可能打算使用&&.

  5. ||&&[ ... ]内不可用。使用两个[ ... ]命令或使用[[ ... ]]

解决上述问题:

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

thenelse 之间什么都没有,如果你什么都不想做,你可以把:放在那里

要删除当前控制器中名称中包含特定字符串的文件,您可以使用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 {} ;

相关内容

  • 没有找到相关文章

最新更新