Bash Shell找出UNIX/Linux系统上是否存在命令($PATH)

时间:2020-01-09 10:46:04  来源:igfitidea点击:

如何从bash shell脚本中查找在UNIX上是否存在命令。
如果$PATH中不存在命令,那么如何在屏幕上显示错误消息。
如何确定Posix系统上是否存在命令?
您可以使用以下命令:

  • command命令您可以执行一个简单命令或者使用名为command的命令显示有关命令的信息。对于所有Posix系统,建议使用此方法。
  • type命令推荐给bash用户。 -P选项强制对每个命令名称进行PATH搜索,即使它是别名,内置函数或者函数,也返回将要执行的磁盘文件的名称。

Posix命令示例

语法如下:

command -v command1 >/dev/null && echo "command1 Found In $PATH" || echo "command1 Not Found in $PATH"
#!/bin/bash
# POSIX command lookup example
CMDS="tar /usr/bin/mysqldump /path/to/other/command"
 
for i in $CMDS
do
        # command -v will return >0 when the $i is not found
	command -v $i >/dev/null && continue || { echo "$i command not found."; exit 1; }
done
 
# add rest of the script as we found all bins in $PATH
echo "Starting backup...."

type -P命令示例

语法如下:

type -P command1 &>/dev/null && echo "Found" || echo "Not Found"

这是一个示例脚本:

#!/bin/bash
# Use Bash builtin called type to determine whether a command exists or not
 
# Use full path if possible...
CMDS="tar /usr/bin/mysqldump ssh rsync"
 
for i in $CMDS
do
	type -P $i &>/dev/null  && continue  || { echo "$i command not found."; exit 1; }
 
# Add rest of the script as we found all bins in $PATH
echo "Starting backup...."
/bin/tar ....

您也可以通过以下命令使用退出状态:

which tar1 &>/dev/null
[ $? -eq 0 ] || echo "tar1 command not found."

出于安全原因,我强烈建议对所有系统管理员活动使用完整路径。
在此示例中,我在/usr/local/theitroad/redhat.paths.ini文件中定义了完整路径:

_path_php_cgi="/usr/bin/php-cgi"
_path_chroot="/usr/sbin/chroot"
_path_lighttpd="/usr/sbin/lighttpd"
_path_mknod="/bin/mknod"
_path_spawn_fcgi="/usr/bin/spawn-fcgi"
_path_cp="/bin/cp"
_path_mv="/bin/mv"

您可以使用以下代码来验证所有路径是否存在,然后再调用这些硬编码部分:

#!/bin/bash
source  /usr/local/theitroad/redhat.paths.ini
# get those path vars
paths=$(set | grep ^_path_*)
 
# verify those paths
for p in $paths
do
	type -P ${p##*=} &>/dev/null || { echo  "${p##*=} not found"; exit 1; }
done
 
# Alright, we got all binaries 
echo "Starting chroot() for ${_path_lighttpd}..."

这是使用-P类型的示例脚本:

#!/bin/bash
RRDTOOL=/usr/bin/rrdtool
OUTDIR=/var/www/html/lighttpd.rrd
INFILE=/home/lighttpd/rrd
OUTPRE=lighttpd-traffic
WIDTH=400
HEIGHT=100
 
# make sure rrdtool exists; else die with an error message
type -P $RRDTOOL &>/dev/null || { echo "$RRDTOOL not found. Set $RRDTOOL in ##代码##"; exit 1; }
 
# make sure dir exits; else create it
[ -d $OUTDIR ] || mkdir -p $OUTDIR
 
# make sure input file exits; else die with an error message
[ -f $INFILE ] || { echo "$INFILE input file not found. set $INFILE in ##代码##"; exit 2; }
 
DISP="-v bytes --title TrafficWebserver \
        DEF:binraw=$INFILE:InOctets:AVERAGE \
        DEF:binmaxraw=$INFILE:InOctets:MAX \
        DEF:binminraw=$INFILE:InOctets:MIN \
        DEF:bout=$INFILE:OutOctets:AVERAGE \
        DEF:boutmax=$INFILE:OutOctets:MAX \
        DEF:boutmin=$INFILE:OutOctets:MIN \
        CDEF:bin=binraw,-1,* \
        CDEF:binmax=binmaxraw,-1,* \
        CDEF:binmin=binminraw,-1,* \
        CDEF:binminmax=binmaxraw,binminraw,- \
        CDEF:boutminmax=boutmax,boutmin,- \
        AREA:binmin#ffffff: \
        STACK:binmax#f00000: \
        LINE1:binmin#a0a0a0: \
        LINE1:binmax#a0a0a0: \
        LINE2:bin#efb71d:incoming \
        GPRINT:bin:MIN:%.2lf \
        GPRINT:bin:AVERAGE:%.2lf \
        GPRINT:bin:MAX:%.2lf \
        AREA:boutmin#ffffff: \
        STACK:boutminmax#00f000: \
        LINE1:boutmin#a0a0a0: \
        LINE1:boutmax#a0a0a0: \
        LINE2:bout#a0a735:outgoing \
        GPRINT:bout:MIN:%.2lf \
        GPRINT:bout:AVERAGE:%.2lf \
        GPRINT:bout:MAX:%.2lf \
        " 
 
$RRDTOOL graph $OUTDIR/$OUTPRE-hour.png -a PNG --start -14400 $DISP -w $WIDTH -h $HEIGHT
$RRDTOOL graph $OUTDIR/$OUTPRE-day.png -a PNG --start -86400 $DISP -w $WIDTH -h $HEIGHT
$RRDTOOL graph $OUTDIR/$OUTPRE-month.png -a PNG --start -2592000 $DISP -w $WIDTH -h $HEIGHT
 
OUTPRE=lighttpd-requests
 
DISP="-v req --title RequestsperSecond -u 1 \
        DEF:req=$INFILE:Requests:AVERAGE \
        DEF:reqmax=$INFILE:Requests:MAX \
        DEF:reqmin=$INFILE:Requests:MIN \
        CDEF:reqminmax=reqmax,reqmin,- \
        AREA:reqmin#ffffff: \
        STACK:reqminmax#00f000: \
        LINE1:reqmin#a0a0a0: \
        LINE1:reqmax#a0a0a0: \
        LINE2:req#00a735:requests" 
 
$RRDTOOL graph $OUTDIR/$OUTPRE-hour.png -a PNG --start -14400 $DISP -w $WIDTH -h $HEIGHT
$RRDTOOL graph $OUTDIR/$OUTPRE-day.png -a PNG --start -86400 $DISP -w $WIDTH -h $HEIGHT
$RRDTOOL graph $OUTDIR/$OUTPRE-month.png -a PNG --start -2592000 $DISP -w $WIDTH -h $HEIGHT