鍍金池/ 問(wèn)答/Linux/ crontab 定時(shí)執(zhí)行 bash 腳本報(bào)錯(cuò):[: -gt: unary ope

crontab 定時(shí)執(zhí)行 bash 腳本報(bào)錯(cuò):[: -gt: unary operator expected

#!/bin/sh  
filesize=`ls -l nohup.out | awk '{ print $5 }'`
echo "`date +%Y-%m-%d_%H:%M:%S` fileSize: $filesize bit" >> clearNohup.log
if [ $filesize -gt 1073741824 ]
then
    echo "`date +%Y-%m-%d_%H:%M:%S` $filesize bigger than 1G, we will back up and clear..." >> clearNohup.log
    cp -f nohup.out nohup.out.bak
    > nohup.out
    echo "`date +%Y-%m-%d_%H:%M:%S` file back up and claer over!" >> clearNohup.log
else
    echo "`date +%Y-%m-%d_%H:%M:%S` $filesize less than 1G,do nothing!" >> clearNohup.log
fi

手動(dòng)執(zhí)行時(shí)候沒(méi)有報(bào)錯(cuò),正常執(zhí)行;在crontab執(zhí)行時(shí)候一直在報(bào)錯(cuò).
系統(tǒng)是centOS6
報(bào)錯(cuò):
clearNohup.sh: line 4: [: -gt: unary operator expected
求大神指點(diǎn)!

回答
編輯回答
青檸

把這句:

filesize=`ls -l nohup.out | awk '{ print $5 }'`

改為這樣:

filesize=`ls -l /absolute/path/to/nohup.out | awk '{ print $5 }'`

要注意的是 crontab 的環(huán)境變量和我們的賬號(hào)都不一樣, 和 root 的環(huán)境變量也不一樣.
類似普通用戶會(huì)先加載 ~/.bashrc 或者 /etc/profile, crontab 則會(huì)在運(yùn)行時(shí)加載 /etc/crontab 導(dǎo)入其環(huán)境變量.
而你的問(wèn)題還不是環(huán)境變量的問(wèn)題. 但類似. 用 crontab 執(zhí)行, 最好腳本內(nèi)都用絕對(duì)路徑.

另外, 即使你第4行過(guò)了, 下面幾個(gè)使用相對(duì)路徑的地方仍然會(huì)出錯(cuò)的.

另外, 統(tǒng)計(jì)文件大小為何不用 du 命令, 用 ls 連管道再解析多費(fèi)事啊.

2018年5月11日 10:28
編輯回答
嘟尛嘴

重現(xiàn):

# filesize可能為空
filesize=

可以改做(基于 #!/usr/bin/env bash):

  • filesize=${$(ls -l nohup.out | awk '{ print $5 }'):-0}
  • 或者 增加邏輯 [ -z "$filesize" ] && filesize=0

經(jīng)其他答案提醒 ls -l nohup.out | awk '{ print $5 }' 管道前的ls命令可能出錯(cuò),可以加上 set -eo pipefail以及早退出

2018年4月16日 18:50