RUI个人博客 首页>>Linux>>[原]Linux不常用的变量替换 脚本中有删除操作可能用到

[原]Linux不常用的变量替换 脚本中有删除操作可能用到

    最近听老男孩儿的课,听到了这部分,对于我来说感觉挺有用,不一定以后会用到这个来提高一下 “逼格",这里记录下

    对于脚本中变量的替换 

(1)  ${value:-word} 

    如果变量名存在且非null,则返回变量的值。否则,返回 word 字符串。
    用途:如果变量未定义,则返回默认值。
    范例:${value:-word},如果value未定义,则表达式的值为 word。
举例:
[root@RAC1 ~]# result=${test:-UNSET}
[root@RAC1 ~]# echo $result
UNSET
[root@RAC1 ~]# echo $test

[root@RAC1 ~]# 
[root@RAC1 ~]# test=aaaaa
[root@RAC1 ~]# 
[root@RAC1 ~]# echo $result
UNSET
[root@RAC1 ~]# result=${test:-UNSET}
[root@RAC1 ~]# 
[root@RAC1 ~]# echo $result
aaaaa
提示:这个变量功能可以用来判断变量是否没有定义。

(2) ${value:=word}
    如果变量名存在且非Null,则返回变量值,否则,设置这个变量值为 word,并返回其值。
    用途:如果变量未定义,则设置为默认值,并返回默认值。
    范例:${value:=word},如果value未定义,则设置value值为 word,返回表达式的值也为word。
[root@RAC1 ~]# result=${test:=UNSET}
[root@RAC1 ~]# echo $result
UNSET
[root@RAC1 ~]# 
[root@RAC1 ~]# echo $test
UNSET
[root@RAC1 ~]# test=bbbbb
[root@RAC1 ~]# 
[root@RAC1 ~]# result=${test:=UNSET}
[root@RAC1 ~]# echo $result
bbbbb

(3) ${value:?"not defined"} 
    如果变量名存在且非 null,则返回变量的值。否则显示变量名:message,并退出当前的命令或者脚本。
    用途:用于捕捉由于变量未定义而导致的错误,并退出程序。
    范例:${value:?"not defined"}如果 value未定义,则显示 -bash:value:  not defined并退出。
[root@RAC1 ~]# result=${test:?"UNSET"}
-bash: test:  UNSET
[root@RAC1 ~]# echo $result

[root@RAC1 ~]# 
[root@RAC1 ~]# test=cccc
[root@RAC1 ~]# 
[root@RAC1 ~]# result=${test:?"UNSET"}
[root@RAC1 ~]# 
[root@RAC1 ~]# echo $test
cccc
[root@RAC1 ~]# echo $result
cccc

(4) ${value:+word} 
    如果变量名存在且非 null,则返回word。否则返回 null。
    用途:测试变量是否存在。
    范例:${value:+word} 如果value已经定义,返回word(也就是真)
[root@RAC1 ~]# unset result
[root@RAC1 ~]# 
[root@RAC1 ~]# unset test
[root@RAC1 ~]# result=${test:+UNSET}
[root@RAC1 ~]# 
[root@RAC1 ~]# echo $result

[root@RAC1 ~]# test=dddd
[root@RAC1 ~]# 
[root@RAC1 ~]# result=${test:+UNSET}
[root@RAC1 ~]# 
[root@RAC1 ~]# echo $result
UNSET

(5) ${value-word} 去掉冒号
[root@RAC1 ~]# httpd=${HTTPD-/usr/sbin/httpd}
[root@RAC1 ~]# pidfile=${PIDFILE-/var/run/httpd.pid}
[root@RAC1 ~]# 
[root@RAC1 ~]# echo $httpd $pidfile
/usr/sbin/httpd /var/run/httpd.pid
[root@RAC1 ~]# 
[root@RAC1 ~]# echo $HTTPD $PIDFILE

[root@RAC1 ~]# 
结论:变量没定义就用 - 号后面的替代

实战1:在脚本中有删除操作的案例
[root@RAC1 ~]# cat d.sh 
path=/root
find ${path:=/tmp/} -name "*.txt" -type f|xargs rm -f
[root@RAC1 ~]# sh -x d.sh 
+ path=/root
+ find /root -name '*.txt' -type f
+ xargs rm -f
[root@RAC1 ~]# 
[root@RAC1 ~]# sed -i '1d' d.sh 
[root@RAC1 ~]# 
[root@RAC1 ~]# cat d.sh 
find ${path:=/tmp/} -name "*.txt" -type f|xargs rm -f
[root@RAC1 ~]# 
[root@RAC1 ~]# sh -x d.sh 
+ find /tmp/ -name '*.txt' -type f
+ xargs rm -f
特别提示:由于变量没有定义,并且有删除操作的。

实战2: 在 /etc/init.d/httpd   有体现 标红部分
[root@RAC1 ~]# cat /etc/init.d/httpd 
#!/bin/bash
#
# httpd        Startup script for the Apache HTTP Server
#
# chkconfig: - 85 15
# description: Apache is a World Wide Web server.  It is used to serve \
#          HTML files and CGI.
# processname: httpd
# config: /etc/httpd/conf/httpd.conf
# config: /etc/sysconfig/httpd
# pidfile: /var/run/httpd.pid

# Source function library.
. /etc/rc.d/init.d/functions

if [ -f /etc/sysconfig/httpd ]; then
        . /etc/sysconfig/httpd
fi

# Start httpd in the C locale by default.
HTTPD_LANG=${HTTPD_LANG-"C"}

# This will prevent initlog from swallowing up a pass-phrase prompt if
# mod_ssl needs a pass-phrase from the user.
INITLOG_ARGS=""

# Set HTTPD=/usr/sbin/httpd.worker in /etc/sysconfig/httpd to use a server
# with the thread-based "worker" MPM; BE WARNED that some modules may not
# work correctly with a thread-based MPM; notably PHP will refuse to start.

# Path to the apachectl script, server binary, and short-form for messages.
apachectl=/usr/sbin/apachectl
httpd=${HTTPD-/usr/sbin/httpd}
prog=httpd
pidfile=${PIDFILE-/var/run/httpd.pid}
lockfile=${LOCKFILE-/var/lock/subsys/httpd}
RETVAL=0
STOP_TIMEOUT=${STOP_TIMEOUT-10}

# check for 1.3 configuration
check13 () {
   CONFFILE=/etc/httpd/conf/httpd.conf
   GONE="(ServerType|BindAddress|Port|AddModule|ClearModuleList|"
   GONE="${GONE}AgentLog|RefererLog|RefererIgnore|FancyIndexing|"
   GONE="${GONE}AccessConfig|ResourceConfig)"
   if LANG=C grep -Eiq "^[[:space:]]*($GONE)" $CONFFILE; then
      echo
      echo 1>&2 " Apache 1.3 configuration directives found"
      echo 1>&2 " please read /usr/share/doc/httpd-2.2.3/migration.html"
      failure "Apache 1.3 config directives test"
      echo
      exit 1
   fi
}

# The semantics of these two functions differ from the way apachectl does
# things -- attempting to start while running is a failure, and shutdown
# when not running is also a failure.  So we just do it the way init scripts
# are expected to behave here.
start() {
        echo -n $"Starting $prog: "
        check13 || exit 1
        LANG=$HTTPD_LANG daemon --pidfile=${pidfile} $httpd $OPTIONS
        RETVAL=$?
        echo
        [ $RETVAL = 0 ] && touch ${lockfile}
        return $RETVAL
}

# When stopping httpd a delay (of default 10 second) is required
# before SIGKILLing the httpd parent; this gives enough time for the
# httpd parent to SIGKILL any errant children.
stop() {
   echo -n $"Stopping $prog: "
   killproc -p ${pidfile} -d ${STOP_TIMEOUT} $httpd
   RETVAL=$?
   echo
   [ $RETVAL = 0 ] && rm -f ${lockfile} ${pidfile}
}
reload() {
    echo -n $"Reloading $prog: "
    if ! LANG=$HTTPD_LANG $httpd $OPTIONS -t >&/dev/null; then
        RETVAL=$?
        echo $"not reloading due to configuration syntax error"
        failure $"not reloading $httpd due to configuration syntax error"
    else
        killproc -p ${pidfile} $httpd -HUP
        RETVAL=$?
    fi
    echo
}

# See how we were called.
case "$1" in
  start)
   start
   ;;
  stop)
   stop
   ;;
  status)
        status -p ${pidfile} $httpd
   RETVAL=$?
   ;;
  restart)
   stop
   start
   ;;
  condrestart)
   if [ -f ${pidfile} ] ; then
      stop
      start
   fi
   ;;
  reload)
        reload
   ;;
  graceful|help|configtest|fullstatus)
   $apachectl $@
   RETVAL=$?
   ;;
  *)
   echo $"Usage: $prog {start|stop|restart|condrestart|reload|status|fullstatus|graceful|help|configtest}"
   exit 1
esac

exit $RETVAL

实战3: /etc/init.d/crond  有体现    标红部分

[root@RAC1 ~]# less /etc/init.d/crond 
#! /bin/bash
#
# crond          Start/Stop the cron clock daemon.
#
# chkconfig: 2345 90 60
# description: cron is a standard UNIX program that runs user-specified \
#              programs at periodic scheduled times. vixie cron adds a \
#              number of features to the basic UNIX cron, including better \
#              security and more powerful configuration options.
# processname: crond
# config: /etc/crontab
# pidfile: /var/run/crond.pid

# Source function library.
. /etc/init.d/functions
. /etc/sysconfig/crond
t=${CRON_VALIDATE_MAILRCPTS:-UNSET}
[ "$t" != "UNSET" ] && export CRON_VALIDATE_MAILRCPTS="$t"

# See how we were called.

prog="crond"

start() {
        echo -n $"Starting $prog: "     
        if [ -e /var/lock/subsys/crond ]; then
            if [ -e /var/run/crond.pid ] && [ -e /proc/`cat /var/run/crond.pid` ]; then


    技术在于积累,在人生的路上徘徊的时候,有位高人说:“厚积薄发


    2016年4月5日   于北京上传     王慧 tyger.wang

昵  称:
邮  箱:
评论内容:
验 证 码:
可用[code][/code]插入代码
点击刷新验证码