如果for循环中的条件错误,则为Unix

时间:2014-01-07 12:41:48

标签: bash 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' &#34 ;.请说明这个脚本中的错误是什么。

4 个答案:

答案 0 :(得分:3)

您的代码存在一些问题:

  1. Don't parse the output of ls。虽然它可能在很多时候都有效,但它会因某些文件名而中断,并且有更安全的替代方案。

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

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

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

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

  6. 解决上述问题:

    for i in *$str*; do
        if [[ $i != username_list.txt && $i = user_list.txt ]]; then
            rm "$i"
        fi
    done
    

答案 1 :(得分:1)

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 {}

答案 2 :(得分:1)

要使用带有[的布尔运算符,您可以使用以下之一:

if [ "$i" != username_list.txt ] && [ "$i" != user_list.txt ] ; then ...
if [ "$i" != username_list.txt -a "$i" != user_list.txt; then ...

但在这种情况下,使用案例陈述可能更清晰:

case "$i" in
username_list.txt|user_list.txt) : ;;
*) rm "$i";;
esac

答案 3 :(得分:1)

也可以使用find

完成
find . -maxdepth 1 -type f -name "*$str*" ! -name username_list.txt ! -name user_list.txt -exec rm {} \;