bash, если сообщение о неожиданном поведении в задании crontab

Вот сценарий

bash --version | head -n1
if [ "$1" == "now"  ]
then
    echo if now
    execut job
else
    echo else "_"$1"_"  # make sure we are not picking any spaces
    if [ condition  ]
    then
    execut something else
    fi
fi

./script now
if now

работает должным образом, если запускается из интерактивной оболочки. Однако при вызове из cron как if вместо этого переходит в блок else

* * * * *   root    /home/user/./script now >> /tmp/log
cat /tmp/log
GNU bash, version 4.3.11(1)-release (x86_64-pc-linux-gnu)
else _now_

То же самое и с "-eq".

Я упустил что-то очень простое, потому что еще не позавтракал?

работает Ubunt 14.04LTS.

3
задан 5 November 2015 в 18:49
2 ответа

, потому что синтаксис имеет только одно равенство: [$ a = $ b]

 if [ ! $a = $b ]; then     #with space in condition and need instruction between then and fi, else doesn't works
 ...Script to execute...
 elif [ ! $a = $c ]; then
 ...Script to execute...
 else
 ...Script to execute...
 fi     

условный список sh

 [ $a = $b ] && return 1 || return 0        conditionnal alternative format
 if [ $a = $b -o $b = $c ]          -o mean OR
 if [ $a = $b -a $b = $c ]          -a mean AND
 if [ $a = $b -o $b = $c ] || [ $a = $b -a $a = $c ] multiple conditionnal or
 if [ $a = $b -o $b = $c ] && [ $a = $b -a $a = $c ] multiple conditionnal and
 if [ -z $a ]                       is empty or null
 if [ ! -z $a ]                     not equal to ""
 if [ -n $a ]                       is not empty or null
 if [ $a -eq $b ]                   equal (numeric)
 if [ $a -ne $b ]                   not equal (numeric)
 if [ $a -gt $b ]                   greater than (numeric)
 if [ $a -ge $b ]                   greater or equal than (numeric)
 if [ $a -lt $b ]                   lower than (numeric)
 if [ $a -le $b ]                   lower or equal than (numeric)
 if [ -d $a ]                       is a directory  
 if [ -e $a ]                       file exist  
 if [ -f $a ]                       is a file
 if [ -g $a ]                       is group allowed for the file
 if [ -r $a ]                       is readable 
 if [ -s $a ]                       file is not 0kb
 if [ -u $a ]                       is user allowed for file
 if [ -w $a ]                       is writable
 if [ -x $a ]                       is executable

больше с bash

 if [[ "$a" =~ "$b" ]]              match (reg exp)
 if [[ $a == *$b* ]]                match (glob)
 if [ "${a/$b}" = $a ]              match (string)
 if [ -z "${a##*$b*}" ]             match (string, work with dropbox !)
 if [ ${a/$b} = $a ]                match (string)
5
ответ дан 3 December 2019 в 05:41

Ввод Комментарий @gordon-davisson в качестве ответа, поскольку именно он решил проблему для меня:

Добавьте строку «shebang» вверху сценария оболочки:

 #!/bin/bash

Это сообщит ОС, что это сценарий bash и ему нужно интерпретировать именно так. Тогда он будет работать с if [ "$a" == "$b" ] и т.п.

0
ответ дан 3 April 2021 в 17:49

Теги

Похожие вопросы