Bash脚本无法正常运行

时间:2018-07-01 09:54:42

标签: linux bash if-statement

当我这样编写脚本时

#!/bin/sh                                                                       

pidof MX-CM48 | xargs kill                                                      

if [ -f /home/root/MX-CM48NEW ]; then                                           
    mv /home/root/MX-CM48NEW /home/root/MX-CM48                                 
    chmod 777 /home/root/MX-CM48                                                
fi                                                                              

cd /home/root                                                                   
./MX-CM48 &     

脚本正在运行。

但是当我试图这样写时:

#!/bin/sh
NEW_FILE="/home/root/MX-CM48NEW"
OLD_FILE="/home/root/MX-CM48"
PATH="/home/root"
APP_NAME="MX-CM48"

pidof $APP_NAME | xargs kill

if [ -f $NEW_FILE ]; then
    mv $NEW_FILE $OLD_FILE
    chmod 777 $OLD_FILE
fi

cd $PATH
./$APP_NAME &

pidof和if不起作用。

2 个答案:

答案 0 :(得分:4)

PATH环境变量定义系统在哪里寻找与命令相对应的可执行文件。这是用冒号分隔的目录列表,其中包含可执行文件,例如/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin。因此,当您使用mv之类的命令时,系统会在/ usr / local / bin中,然后在/ usr / bin中,然后在/ bin等中查找名为“ mv”的文件。

在脚本中将PATH设置为“ / home / root”时,它将成为系统查找命令可执行文件的唯一位置。我想那根本不是你想要的。

解决方案很简单:为变量使用其他名称。实际上,最好将小写或混合大小写的变量名用于您的事物,因为有很多全大写字母的变量名具有某种特殊含义,并且很难记住并避免所有它们。

顺便说一句,您应该(几乎)始终将变量引用双引号,例如pidof "$APP_NAME"避免了shell解析未加引号的变量时产生的意外怪异。最后,当您在脚本中使用cd时,应始终检查错误;否则,如果cd命令失败,则脚本的其余部分将继续在错误的位置继续执行。

cd "$path" || {
    echo "Error moving to $path directory; giving up" >&2
    exit 1
}
"./$app_name" &

答案 1 :(得分:0)

除非您将所有命令复制到/home/root,否则很明显出了什么问题。

PATH="/home/root"

(可能)应该是:

PATH="$PATH:/home/root"

或使用完整的路径名,例如:

/usr/bin/pidof $APP_NAME | /usr/bin/xargs /bin/kill