字符串比较在shell脚本中不起作用

时间:2011-04-17 08:28:06

标签: string shell unix

我编写了一个简单的shell脚本来完成一些自动化工作。基本上,脚本会搜索当前路径中的所有文件,如果文件是指定的文件,则会执行一些操作。 以下是相关的行---

#!/bin/bash
for i in `ls *`
do
if [$i =="ls.sh"] 
then .... //do something
fi
done

然而,第3行中的字符串比较不起作用,我在运行脚本时得到了这个 -

./ls.sh: line 3: [scripth.sh: command not found
./ls.sh: line 3: [scripth.sh~: command not found
./ls.sh: line 3: [test.sh: command not found

要做的更正是什么?

5 个答案:

答案 0 :(得分:3)

首先,不要那样使用ls。如果您的文件有空格,它将会疯狂! 使用shell扩展。然后,您可以使用case/esac进行字符串比较。 (或if if else)

for file in *
do
  case "$file" in
    "ls.sh" ) echo "do something"
     ;;
  esac
done

答案 1 :(得分:2)

有几个问题。

在第1行中,你没有按照自己的想法行事。你应该在ls *:

附近加一个反引号
for i in `ls *`

将遍历当前目录中列出的所有文件。你的行不会运行任何命令,而是使用*来获取所有文件,你的列表将在前面包含一个单词“ls”。

从命令行尝试:

echo ls *
echo `ls *`

您可能只想这样做:

for i in *

第二个问题。在方括号内放置空格:

[ $i == "ls.sh" ]

空间是必要的。

第三个问题。使用one =进行字符串比较

[ $i = "ls.sh" ]

答案 2 :(得分:1)

使用:if [ "$i" = "ls.sh" ] - 注意空格。

答案 3 :(得分:0)

您没有在==之后添加空格,因此您的代码应该是:

#!/bin/bash
for i in `ls *`
do
    if [ $i == "ls.sh" ] 
    then 
        //do something
    fi
done

答案 4 :(得分:0)

如果您只想检查文件的现有文件,可以直接在shell中执行。

if [ -e ls.sh ]
then 
  # ... do something
fi