在shell脚本

时间:2015-09-24 09:31:48

标签: linux bash shell

我需要检查bash脚本中的给定字符串是否是命令。 换句话说:我需要检查该String是否是/ bin目录中的文件名(仅/ bin)。

我试过

echo "Write a bash command: "

read -r var2

if [[ -z (find /bin -name $var2) ]]
    then echo "That's not a command" && exit 1

fi

但它没有用。

想法?

编辑:解决了。正如amdixon建议我为$(find / bin -name $ var2)更改了(find / bin -name $ var2)。

谢谢老兄。

3 个答案:

答案 0 :(得分:1)

根据您的实际要求,它可能比那更容易:

if ! [ -x /bin/"$var2" ]
then
    echo "That's not a command" && exit 1
fi

[test命令的缩写,对于-x参数,如果给定的文件可由您执行,它将返回0(true)。请注意,这将排除其他用户可执行的命令,因为您没有足够的权限。

如果使用-f参数,[将测试/bin目录中的任何文件,无论它是否可执行(当然通常都是):

if ! [ -f /bin/"$var2" ]
then
    echo "That's not a command" && exit 1
fi

如果您需要确保该文件是可执行的(即使它可能无法执行),请参阅this question以获取使用file的解决方案。

在命令行上键入help test以阅读有关[的可能参数的更多信息。

答案 1 :(得分:0)

echo "Write a bash command: "

read -r var2

if [ ! -f /bin/"$var2" ]
    then echo "That's not a command" && exit 1
fi

是在bash中执行此操作的自然方式。 [ expr ]是内置test命令的简写。输入人builtins并滚动,直至找到test,以获得test可以为您做的完整说明。例如,如果您希望同时测试文件是否存在且可执行,则可以替换:

[ ! -f /bin/"$var2" ]

由:

[ ! -x /bin/"$var2" ]

答案 2 :(得分:0)

  

我需要检查bash脚本中的给定字符串是否为命令。

VS

  

我需要检查该String是否是/ bin目录中的文件名(仅/ bin)。

绝不是相同。我想你提到众所周知的“shell命令”,在这种情况下,你可能有三个错误的原因:

  1. 根层次结构适用于启动系统所需的所有内容。这可能包括您认为的“命令”,但也包括其他内容(例如lvmcryptsetup
  2. 出于同样的原因,你会认为“命令”的二进制文件可能会从/ bin中丢失,而是居住在/ usr / bin中。
  3. 炮弹有“内置”命令,并且无法保证您会将它们视为单独的二进制文件。
  4. 考虑到所有这些,如果您仍想在/ bin中查找可执行文件,则根本没有理由使用findtest(或简写版本只是写括号)就足够了,比如if [ -x /bin/$var2 ]; then ......