Linux系统启动流程和特殊变量及脚本编程(3)

1.特殊变量值

${变量参数#*字符}  意思是从左至右,以“字符”为分隔符,取第一个分隔符后面的所有字符串

${变量参数##*字符} 意思是从左至右,以“字符”为分隔符,取最后一个分隔符后面的所有字符串

${变量参数%字符*}  意思是从右至左,以“字符”为分隔符,取第一个分隔符后面的所有字符串

${变量参数%%字符*} 意思是从右至左,以“字符”为分隔符,取最后一个分隔符后面的所有字符串

${#变量名}       意思是计算变量里的字符串个数值 

例如:假设变量A=“10 23 45 56”,以空白为分隔符,取出以下不同值

wKioL1clyWfBzFUNAAFPtGjcv8s680.jpg

${变量名:-字符串值}:如果变量为空或未定义,则变量展开为“字符串值”;

              否则,展开为变量的值;

${变量名:+字符串值}:如果变量为空或未定义,不做任何操作;否则,则展开为“字符串值”;

${变量名:=字符串值}:如果变量为空或未定义,则变量展开为“字符串值”,

              并将展开后的值赋值给变量;

wKiom1coOVmjOPtAAAGIN9PeVsY385.jpg

${变量名:偏移:长度值}:取子串,从"偏移"处的后一个字符开始,取长度值的子串;

${变量名:偏移}:     取子串,从"偏移"处的后一个字符至末尾所有字符串

wKiom1coOdGwT4JfAADLCiJGOCw442.jpg

2.linux系统时脚本调用基本顺序如下:

 2.1:init主进程,读取/etc/inittab配置文件

 2.2.从/etc/inittab配置文件中,设定默认运行别级

 2.3.从/etc/inittab配置文件中,执行/etc/rc.d/rc.sysinit脚本文件

 2.4.从/etc/inittab配置文件中,执行指定运行级别的脚本

  如:/etc/rc.d/rc ->/etc/rc.d/rc[0-6].d/*->/etc/rc.d/init.d/*,层层按序调用

 2.5.最后执行/etc/rc.d/rc.local脚本


3.订制一个外部命令,如,ls,useradd,mount等命令,而每个命令依赖自己的库文件,

 写一个如下脚本,实现自动copy现有系统中的外部命令并且copy对应的库文件

#!/bin/bash

DEST=/mnt/sysroot


libcp() {

  LIBPATH=${1%/*}

  [ ! -d $DEST$LIBPATH ] && mkdir -p $DEST$LIBPATH

  [ ! -e $DEST${1} ] && cp $1 $DEST$LIBPATH && echo "$1 is coped successfully " 

}

 

bincp() {

  CMDPATH=${1%/*}

  [ ! -d $DEST$CMDPATH ] && mkdir -p $DEST$CMDPATH

  [ ! -e $DEST${1} ] && cp $1 $DEST$CMDPATH

  for LIB in `ldd $1 | grep -o "/.*lib\(64\)\{0,1\}/[^[:space:]]\{1,\}"`; do

    libcp $LIB

  done

}


 read -p "Please Input You need add command: " CMD

until [ $CMD == 'q' ]; do

  if ! which $CMD &> /dev/null; then

     ehco "Your command is not exist..."

     read -p "Please Input You need add command,again: " CMD

     continue

  fi

  COMMAND=`which $CMD | grep -v "^alias" | grep -o "[^[:space:]]\{1,\}"`

  bincp $COMMAND

  echo "$COMMAND is copied ok"

  read -p "Please Input You need add command: " CMD

done

4.订制一个开关机脚本,名称:/etc/rc.d/init.d/halt


#!/bin/bash

case $0 in

*reboot)

 COMMAND='/sbin/reboot' ;;

*halt)

 COMMAND='/sbin/halt -p' ;;

*)

 echo "Only call by *halt | *reboot "

 ;;

esac

case $1 in

start)

 ;;

stop)

 ;;

*)

 echo"Usage: `basename $0` {start|stop}"

 ;;

esac

exec $COMMAND

~               

5.订制一个在系统开关机或服务开关时显示OK为绿色,Failed为红色脚本 

 脚本名称:/etc/rc.d/init.d/functions

#!/bin/bash

SCREEN=`stty -F /dev/console size 2> /dev/null`

COLUMNS=${SCREEN#* }

[ -z $COLUMNS ] && COLUMNS=80

SPA_COL=$[$COLUMNS-14]

 

RED='\033[31m'

GREEN='\033[32m'

YELLOW='\033[33m'

BLUE='\033[34m'

NORMAL='\033[0m'

success() {

 string=$1

 RT_COL=$[$SPA_COL-${#string}]

 echo -n "$string"

 for I in `seq 1 $RT_COL`; do

    echo -n " "

 done

 echo -e "[   ${GREEN}OK${NORMAL}   ]"

}

failure() {

 string=$1

 RT_COL=$[$SPA_COL-${#string}]

 echo -n "$string"

 for I in `seq 1 $RT_COL`; do

    echo -n " "

 done

 echo -e "[ ${RED}FAILED${NORMAL} ]"

}

~     

注意:此脚本也可以设成一个配置文件供其他脚本调用使用

6.订制一个网络启动脚本,名称:/etc/rc.d/init.d/network

#!/bin/bash

# chkconfig: 35 10 89

# description: netwrok service

prog=network

. /etc/rc.d/init.d/functions  调用上面显示服务颜色脚本文件(注意调用时将第一行删除)

CONF=/etc/sysconfig/network-scripts/ifcfg-eth0

. $CONF

start() {

 ifconfig eth0 $IPADDR/$NETMASK up

 [ -z $GATEWAY ] && route add default gw $GATEWAY

}

stop() {

 ifconfig eth0 down

}

status() {

 ifconfig eth0

}

usage() {

 echo "Usage:$prog: {start|stop|restart|status}"

}

 

case $1 in

start)

 start

 success "Config network eth0"

 ;;

stop)

 stop

 success "Stop network eth0"

 ;;

restart)

 stop

 start

 success "Restart network eth0"

 ;;

status)

 status

 ;;

*)

 usage

 exit 5

 ;;

esac

7.订制一个系统初始化脚本/etc/rc.d/rc.sysinit

root@localhost sysroot]# vim etc/rc.d/rc.sysinit 


#!/bin/bash

. etc/rc.d/init.d/functions

 

echo -e "\t Welcome to \033[31mWillow person\033[0m Linux..."

echo "Remount rootfs..."

mount -n -o remount,rw /

mount -a

[ $? -eq 0 ] && success "mount other system files" || failure "mount other system files"

echo "set the hostname..."

#[ -f /etc/sysconfig/network ] && source /etc/sysconfig/network

[ -f /etc/sysconfig/network ] && . /etc/sysconfig/network

[ -z $HOSTNAME -o $HOSTNAME == '(none)' ] && HOSTNAME=localhost

/bin/hostname $HOSTNAME

insmod /lib/modules/mii.ko

[ $? -eq 0 ] && success "Loading modules mii " || failure "Loading modules mii"

insmod /lib/modules/pcnet32.ko

[ $? -eq 0 ] && success "Loading modules pcnet32 " || failure "Loading modules pcnet32"

#ifconfig eth0 1.1.1.100

ifconfig lo 127.0.0.1

#/bin/bash

/sbin/sysctl -p

7.订制一个基本服务脚本:名称:/etc/rc.d/init.d/Xserver

#!/bin/bash

 

# chkconfig: 35 68 31

# description: tserve script service

. /etc/rc.d/init.d/functions

#prog=`basename $0`

prog=tserver

lockfile=/var/lock/subsys/$prog

start() {

# echo "Starting $prog..."

 touch $lockfile

 [ $? -eq 0 ] && success "Starting $prog" || failure " Starting $prog"

}

 

stop() {

# echo "Stopping $prog..."

 [ $? -eq 0 ] && success "Stopping $prog" || failure " Stopping $prog"

 rm -rf $lockfile

}

 

status() {

  if [ -f $lockfile ]; then

     echo "$prog is Running..."

  else

     echo "$prog is Stopped..."

  fi

}

 

usage() {

  echo "Usage: $prog {start|stop|status|restart}"

}

case $1 in

start)

 start ;;

stop)

 stop ;;

restart)

 stop

 start

 ;;

status)

 status

 ;;

*)

 usage

 exit 6

 ;;

esac