我在检查字符串是否为空时遇到了问题。
我获取了第一列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";
笔记:
- 脚本用于学术目的,以使代码无需 [ -x file ] 选项即可运行。
- 脚本是在 shell 而不是 bash 中编写的。
如果你懒得向下滚动,这里有固定的代码片段:
#!/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
您使用的代码存在一些问题:
- 不建议解析
ls
,但由于它与您的问题无关,所以我们暂时保留它。 - 使用
``
执行命令是可行的,但这种方式比较老套,应该用 来代替$()
。这里不是很重要,但也许值得将来一提。 - 您的
if
-construct 语法错误。它缺少 athen
和 afi
。 - 你使用的方式
-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 方法。