: "${LOG_FILE:=/var/log/xxx.log}"

: "${LOG_FILE:=/var/log/factory_install.log}"

  Shell Parameter Expansioin

${parameter:=word}

If parameter is unset or null, the expansion of word is assigned to parameter. The value of parameter is then substituted. Positional parameters and special parameters may not be assigned to in this way.

#

ppparameter is unset
#!/bin/sh
set +x
a=${ppparameter:=wwwword}
echo ${a}

cor@debian:
/tmp$ . 1.sh wwwword

#

ppparameter='Peter',  is not null
cor@debian:/tmp$ cat 1.sh 

#!/bin/sh
set -x

ppparameter="Peter"
a=${ppparameter:=wwwword}
set +x
echo "a = "${a}
cor@debian:/tmp$ . 1.sh 
++ ppparameter=Peter
++ a=Peter
++ set +x
a = Peter

 

#

 

What is the purpose of the : (colon) GNU Bash builtin? linkage from stackoverflow, seems a good one, but not fully understand for me now.

let's try design a experiment to help us to understand how it works

#try with auth.log

 

cor@debian:/var/log$ ls
alternatives.log        alternatives.log.5.gz  auth.log.1     daemon.log.1     debug.4.gz      dpkg.log.4.gz   gdm3           lastlog            syslog       unattended-upgrades  Xorg.0.log
alternatives.log.1      alternatives.log.6.gz  auth.log.2.gz  daemon.log.2.gz  dpkg.log        dpkg.log.5.gz   hp             messages           syslog.1     user.log             Xorg.0.log.old
alternatives.log.10.gz  alternatives.log.7.gz  auth.log.3.gz  daemon.log.3.gz  dpkg.log.1      dpkg.log.6.gz   installer      messages.1         syslog.2.gz  user.log.1           Xorg.1.log
alternatives.log.11.gz  alternatives.log.8.gz  auth.log.4.gz  daemon.log.4.gz  dpkg.log.10.gz  dpkg.log.7.gz   kern.log       messages.2.gz      syslog.3.gz  user.log.2.gz        Xorg.1.log.old
alternatives.log.12.gz  alternatives.log.9.gz  btmp           debug            dpkg.log.11.gz  dpkg.log.8.gz   kern.log.1     messages.3.gz      syslog.4.gz  user.log.3.gz        Xorg.2.log
alternatives.log.2.gz   apache2                btmp.1         debug.1          dpkg.log.12.gz  dpkg.log.9.gz   kern.log.2.gz  messages.4.gz      syslog.5.gz  user.log.4.gz        Xorg.2.log.old
alternatives.log.3.gz   apt                    cups           debug.2.gz       dpkg.log.2.gz   faillog         kern.log.3.gz  sddm.log           syslog.6.gz  wtmp
alternatives.log.4.gz   auth.log 

 #

cor@debian:/tmp$ cat 1.sh 
#!/bin/sh
set -x
ppparameter="Peter"
a=${ppparameter:=wwwword}
set +x
: "${LOG_FILE1:=/var/log/factory_install.log}"
: "${LOG_FILE2:=/var/log/auth.log}"

echo "a = "${a}
echo "LOG_FILE1 = " "${LOG_FILE1}"
echo "LOG_FILE2 = " "${LOG_FILE2}"
 
cor@debian:/tmp$ . 1.sh ++ ppparameter=Peter ++ a=Peter ++ set +x a = Peter LOG_FILE1 = /var/log/factory_install.log LOG_FILE2 = /var/log/auth.log

  

cor@debian:/tmp$ ls /var/log/factory_install.log -l
ls: cannot access '/var/log/factory_install.log': No such file or directory
cor@debian:/tmp$ ls /var/log/auth.log -l
-rw-r----- 1 root adm 82132 Jan 15 15:17 /var/log/auth.log

From the experiments above: it seems there is no difference.

remove the ':'

cor@debian:/tmp$ . 1.sh 
++ ppparameter=Peter
++ a=Peter
++ set +x
bash: /var/log/factory_install.log: No such file or directory
bash: /var/log/auth.log: Permission denied
a = Peter
LOG_FILE1 =  /var/log/factory_install.log
LOG_FILE2 =  /var/log/auth.log
cor@debian:/tmp$ cat 1.sh 
#!/bin/sh
set -x
ppparameter="Peter"
a=${ppparameter:=wwwword}
set +x
"${LOG_FILE1:=/var/log/factory_install.log}"
"${LOG_FILE2:=/var/log/auth.log}"

echo "a = "${a}
echo "LOG_FILE1 = " "${LOG_FILE1}"
echo "LOG_FILE2 = " "${LOG_FILE2}"

  

 

What does a leading colon (:) mean in a script?

 

"Another place you might see it is with conditional variable setting. For example, say we want to set xx to "foo" but only if it isn't already set. We can use use '${xx:="foo"}' as a shorthand way to avoid "if" or "case" blocks, but that has a side effect:

${xx:="foo"}
-bash: foo: command not found
 

You could redirect errout to stop that complaint, but what if 'foo' were a real command? It would be executed, and that might not be what you want. You can avoid that by the leading ":" again:

: ${xx:="foo"}
 

So that's why those leading colons are often found in shell scripts."

#

 

Introduction to 'if'

[ -z STRING ] True of the length if "STRING" is zero.

长度为零 条件成立

# STRING is  zero:

localhost /tmp/shell # cat 1.sh 
DA=""
#DA="aaaaa"
if [ -z "${DA}" ];then
echo "ttttttT"
else
echo "Ssssss"
fi
localhost /tmp/shell # . 1.sh 
ttttttT

  

  # STRING is not zero:

localhost /tmp/shell # cat 1.sh 
#DA=""
DA="aaaaa"
if [ -z "${DA}" ];then
echo "ttttttT"
else
echo "Ssssss"
fi
localhost /tmp/shell # . 1.sh 
Ssssss

  

[ -n STRING ] or [ STRING ] True if the length of "STRING" is non-zero.

#条件成立如果 长度大于零

localhost /tmp/shell # cat 2.sh 
#DA=""
DA="aaaaa"
if [ -n "${DA}" ];then
echo "ttttttT"
else
echo "Ssssss"
fi
localhost /tmp/shell # . 2.sh 
ttttttT

  

# 等于零

localhost /tmp/shell # cat 2.sh 
DA=""
#DA="aaaaa"
if [ -n "${DA}" ];then
echo "ttttttT"
else
echo "Ssssss"
fi
localhost /tmp/shell # . 2.sh 
Ssssss

  

-x FILE ] True if FILE exists and is executable.

 

#

 

#

-e FILE ] True if FILE exists.

if [[ -e /dev/nvram ]];

 #

 

-r FILE ] True if FILE exists and is readable.

#

#

-b FILE ] True if FILE exists and is a block-special file.

#if [ -b "${src_media}" ]; then

 

-s FILE ] True if FILE exists and has a size greater than zero.

# if [ -s "${tmp_dir}/firmware" ]; then

#

 

 

posted @ 2021-01-06 13:46  碧水东流至此回  阅读(275)  评论(0编辑  收藏  举报