#!/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 ;.请说明这个脚本中的错误是什么。
答案 0 :(得分:3)
您的代码存在一些问题:
Don't parse the output of 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
答案 1 :(得分:1)
在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 {}
答案 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 {} \;