加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

shell学习四-----特殊变量二

发布时间:2020-12-15 16:35:22 所属栏目:安全 来源:网络整理
导读:7、学习使用系统脚本 /etc/init.d/rpcbind [root@node01 day2]# vi /etc/init.d/rpcbind #! /bin/sh # # rpcbind Start/Stop RPCbind # # chkconfig: 2345 13 87 # description: The rpcbind utility is a server that converts RPC program # numbers into
7、学习使用系统脚本
/etc/init.d/rpcbind
[root@node01 day2]# vi /etc/init.d/rpcbind
#! /bin/sh
#
# rpcbind Start/Stop RPCbind
#
# chkconfig: 2345 13 87
# description: The rpcbind utility is a server that converts RPC program
# numbers into universal addresses. It must be running on the
# host to be able to make RPC calls on a server on that machine.
#
# processname: rpcbind
# probe: true
# config: /etc/sysconfig/rpcbind

# This is an interactive program,we need the current locale
[ -f /etc/profile.d/lang.sh ] && . /etc/profile.d/lang.sh
# We can't Japanese on normal console at boot time,so force LANG=C.
if [ "$LANG" = "ja" -o "$LANG" = "ja_JP.eucJP" ]; then
if [ "$TERM" = "linux" ] ; then
LANG=C
fi
fi


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


# Source networking configuration.
[ -f /etc/sysconfig/network ] && . /etc/sysconfig/network


prog="rpcbind"
[ -f /etc/sysconfig/$prog ] && . /etc/sysconfig/$prog


RETVAL=0
uid=`id | cut -d( -f1 | cut -d= -f2`


start() {
# Check that networking is up.
[ "$NETWORKING" = "yes" ] || exit 6


[ -f /sbin/$prog ] || exit 5


# Make sure the rpcbind is not already running.
if status $prog > /dev/null ; then
exit 0
fi


# Only root can start the service
[ $uid -ne 0 ] && exit 4


echo -n $"Starting $prog: "
daemon $prog $1 "$RPCBIND_ARGS"
RETVAL=$?
echo
if [ $RETVAL -eq 0 ] ; then 成功了,就创建一个文件,这里写脚本写个plog,启动建立,停止删掉
touch /var/lock/subsys/$prog
[ ! -f /var/run/rpcbind.pid ] &&
/sbin/pidof $prog > /var/run/rpcbind.pid
fi
return $RETVAL
}


stop() {
echo -n $"Stopping $prog: "
killproc $prog
RETVAL=$?
echo
[ $RETVAL -eq 0 ] && {
rm -f /var/lock/subsys/$prog 成功了,就创建一个文件,这里写脚本写个plog,启动建立,停止删掉
rm -f /var/run/rpcbind*
}
return $RETVAL
}


# See how we were called.
case "$1" in 接传参,如果是以下的就执行。
start)
start
RETVAL=$? 返回值给一个变量,返回给当前shell
;;
stop)
stop
RETVAL=$?
;;
status)
status $prog
RETVAL=$?
;;
restart | reload| force-reload)
stop
start
RETVAL=$?
;;
condrestart | try-restart)
if [ -f /var/lock/subsys/$prog ]; then
stop
start -w
RETVAL=$?
fi
;;
*)
echo $"Usage: $0 {start|stop|status|restart|reload|force-reload|condrestart|try-restart}" $0这里表示命令自己
RETVAL=2
;;
esac


exit $RETVAL


执行命令:
[root@node01 day2]# /etc/init.d/rpcbind start 这个start就是上面$1接收传参


[root@node01 day2]# /etc/init.d/rpcbind dddd fkdjkj kjkjf
Usage: /etc/init.d/rpcbind {start|stop|status|restart|reload|force-reload|condrestart|try-restart}
[root@node01 day2]#
[root@node01 day2]# /etc/init.d/rpcbind status
rpcbind (pid 1292) is running...
=======================================================================
8、$*和$@的区别(了解)
$*获取shell的所有传参,将所有的参数视为单个字符串,相当于“$1$2$3"
$@他把所有参数显示为“$1" “1" ”$3"
注意:上述区别在于加双引号的时候,即“$*" 和"$@"
例子:
[root@node01 day2]# set -- "lao lang" welcome to beijing 传入4个参数
[root@node01 day2]# echo $# 打印参数
4
[root@node01 day2]# for i in "$*";do echo $i;done
lao lang welcome to beijing
[root@node01 day2]# for i in "$@";do echo $i;done 在有双引号的情况下去处理,每个单数独立输出
lao lang
welcome
to
beijing
[root@node01 day2]# for i in "$@";do echo $i;done
lao lang
welcome
to
beijing


[root@node01 day2]# for i in $*;do echo $i;done 在没有双引号的情况下,把参数分开了,这样“$*" 和"$@"结果一样了
lao
lang
welcome
to
beijing
[root@node01 day2]# for i in $@;do echo $i;done
lao
lang
welcome
to
beijing
=====================================================================
9、移动位置变量 内置变量
[root@node01 day2]# shift
[root@node01 day2]# for i in $@;do echo $i;done
welcome
to
beijing
[root@node01 day2]# shift
[root@node01 day2]# for i in $@;do echo $i;done
to
beijing
[root@node01 day2]# shift
[root@node01 day2]# for i in $@;do echo $i;done
beijing
[root@node01 day2]# shift
[root@node01 day2]# for i in $@;do echo $i;done


[root@node01 day2]# help shift
shift: shift [n]
Shift positional parameters.

Rename the positional parameters $N+1,$N+2 ... to $1,$2 ... If N is
not given,it is assumed to be 1.

Exit Status:
Returns success unless N is negative or greater than $#.
例子
[root@node01 day2]# vim `which ssh-copy-id`
#!/bin/sh


# Shell script to install your public key on a remote machine
# Takes the remote machine name as an argument.
# Obviously,the remote machine must accept password authentication,
# or one of the other keys in your ssh-agent,for this to work.


ID_FILE="${HOME}/.ssh/id_rsa.pub"


if [ "-i" = "$1" ]; then 如果$1是-i做shift
shift
# check if we have 2 parameters left,if so the first is the new ID file
if [ -n "$2" ]; then
if expr "$1" : ".*.pub" > /dev/null ; then
ID_FILE="$1"
else
ID_FILE="$1.pub"
fi
shift # and this should leave $1 as the target name
fi
else
if [ x$SSH_AUTH_SOCK != x ] ; then
GET_ID="$GET_ID ssh-add -L"
fi
fi
if [ -z "`eval $GET_ID`" ] && [ -r "${ID_FILE}" ] ; then
GET_ID="cat ${ID_FILE}"
fi


if [ -z "`eval $GET_ID`" ]; then
echo "$0: ERROR: No identities found" >&2
exit 1
fi


if [ "$#" -lt 1 ] || [ "$1" = "-h" ] || [ "$1" = "--help" ]; then
echo "Usage: $0 [-i [identity_file]] [user@]machine" >&2
exit 1
fi


{ eval "$GET_ID" ; } | ssh $1 "umask 077; test -d ~/.ssh || mkdir ~/.ssh ; cat >> ~/.ssh/authorized_keys && (test -x /sbin/restorecon && /sbin/restorecon ~/.ssh ~/.ssh
/authorized_keys >/dev/null 2>&1 || true)" || exit 1


cat <<EOF
Now try logging into the machine,with "ssh '$1'",and check in:


.ssh/authorized_keys


to make sure we haven't added extra keys that you weren't expecting.


EOF
50,1 Bot


if [ -z "`eval $GET_ID`" ]; then
echo "$0: ERROR: No identities found" >&2
exit 1
fi


if [ "$#" -lt 1 ] || [ "$1" = "-h" ] || [ "$1" = "--help" ]; then
echo "Usage: $0 [-i [identity_file]] [user@]machine" >&2
exit 1
fi


{ eval "$GET_ID" ; } | ssh $1 "umask 077; test -d ~/.ssh || mkdir ~/.ssh ; cat >> ~/.ssh/
authorized_keys && (test -x /sbin/restorecon && /sbin/restorecon ~/.ssh ~/.ssh/authorized
_keys >/dev/null 2>&1 || true)" || exit 1


cat <<EOF
Now try logging into the machine,and check in:


.ssh/authorized_keys


to make sure we haven't added extra keys that you weren't expecting.


EOF

===========================================================================
10、其他
$$ 获取当前shell的进程号(PID):当系统中只能同时运行一个相同的脚本
例子:
[root@node01 ~]# vi p.sh
echo 1
sleep 300
~
[root@node01 day2]# sh pid.sh &
[2] 10621
[root@node01 day2]#
[root@node01 day2]# ps -ef |grep pid.sh
root 10621 10581 0 10:33 pts/1 00:00:00 sh pid.sh
root 10627 10581 0 10:33 pts/1 00:00:00 grep pid.sh
[root@node01 day2]# vi pid.sh
echo $$ >/tmp/a.pid
sleep 300
[root@node01 day2]# sh pid.sh &
[3] 10630
[root@node01 day2]# kill -USR2 `cat /tmp/a.pid`
[root@node01 day2]# ps -ef |grep pid.sh|grep -v grep
[root@node01 day2]# cat pid.sh
[root@node01 day2]# vi pid.sh
#!/bin/sh
pidpath=/tmp/a.pid
if [ -f "$pidpath" ]
then
kill -USR2 `cat $pidpath` >/dev/null 2>&1
rm -f $pidpath
fi
echo $$ >$pidpath
sleep 300
~
[root@node01 day2]# ps -ef |grep pid.sh|grep -v grep
root 10743 1 0 10:48 ? 00:00:00 sh pid.sh
$! 执行上一个指令的PID
$_ 再此之前执行的命令或者脚本的最后一个参数
=========================================================================
以上变量重要程度

$?>$n>$#>$0

=========================================================================

总结: 变量 含义 $0 当前脚本的文件名 $n 传递给脚本或函数的参数。n 是一个数字,表示第几个参数。例如,第一个参数是$1,第二个参数是$2。 $# 传递给脚本或函数的参数个数。 $* 传递给脚本或函数的所有参数。 $@ 传递给脚本或函数的所有参数。被双引号(" ")包含时,与 $* 稍有不同,下面将会讲到。 $? 上个命令的退出状态,或函数的返回值。 $$ 当前Shell进程ID。对于 Shell 脚本,就是这些脚本所在的进程ID。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读