字符串“if”语句比较字符串是否为空

字符串“if”语句比较字符串是否为空

我在检查字符串是否为空时遇到了问题。
我获取了第一列ls -l信息并尝试grep搜索字符串中的“x”。如果字符串为空,则应继续。但无论字符串是否为空,我都会得到此 if 语句的退出代码 0。

如果我使用命令ls -l $1 | awk '{print $1}',我会得到-rw-r--r-- ,而当我 grep 它时,我得到一个空字符串。

#!/bin/sh

test= ` ls -l $1 | awk '{print $1}' | grep x ` ;
if [ -n $test ];
echo "file is not executable";

笔记:

  1. 脚本用于学术目的,以使代码无需 [ -x file ] 选项即可运行。
  2. 脚本是在 shell 而不是 bash 中编写的。
  3. 如果你懒得向下滚动,这里有固定的代码片段:

      #!/bin/sh
      PartOfString=` file $1 | awk '{print $2}' `;
      if [ $PartOfString == executable ];
      then
      echo "file is executable";
      else
      echo "file is not executable or its not file";
      fi
    

答案1

您使用的代码存在一些问题:

  1. 不建议解析ls,但由于它与您的问题无关,所以我们暂时保留它。
  2. 使用``执行命令是可行的,但这种方式比较老套,应该用 来代替$()。这里不是很重要,但也许值得将来一提。
  3. 您的if-construct 语法错误。它缺少 athen和 a fi
  4. 你使用的方式-n是错误的。-n测试字符串是否不是空的。

这是一个改进的版本:

#!/bin/sh                                       

testString=$(ls -l $1 | awk '{print $1}' | grep x)
if [ -n "$testString" ]
then
    echo "file is executable"
else
    echo "file is not executable"
fi

问题是关于字符串操作,仅使用可执行标志作为示例,但我仍然想提一下检查文件是否可执行的推荐方法:

#!/bin/bash
file="$1"

if [[ -x "$file" ]]
then
    echo "File '$file' is executable"
else
    echo "File '$file' is not executable or found"
fi

答案2

无需使用 ls 和 awk 来测试文件是否可执行,只需使用带有测试的 -x 标志即可

  [ -x $1 ] && echo executable || echo not executable

答案3

所以我终于找到了解决方案。

现在代码片段如下所示:

#!/bin/sh

test=` file $1 | awk '{print $2}' `;
if [ $test == executable ];
then
echo "file is executable";
else
echo "file is not executable or its not file";
fi

请注意,第一个参数应该是您要检查的文件。此代码的思路是通过不使用 -x 选项来检查文件是否可执行。如果您正在寻找高效的代码而不是学术代码,请使用前面描述的 Wayne_Yux 方法。

相关内容