使用 set 和 eval 取当前的运行级别
源码出自 CentOS6.X系统 sshd 服务脚本:/etc/init.d/sshd
1 | [user1@study ~]$ runlevel=$(set -- $(runlevel); eval "echo \$$#" ) |
分析:
将 runlevel
命令执行结果通过 set --
根据分隔符IFS,把值依次赋给位置参数 ($1,$2,$3…)
1 | [user1@study ~]$ runlevel |
$#取得位置参数的个数为两个
1 | [user1@study ~]$ echo $# |
要取的数值为第二个参数即最后一个,使用 $2
即可取得第二个位置参数,这里的 2 使用 $#
来代替。由于 $$
代表当前命令的PID,因此需要转义 $
即 \$$#
。
要用 eval 做二次扫描,把 echo 的字符串当做命令解析,第二次解析 $2
的值为 3 。不进行解析的话 $2
只能当做纯字符串输出
1 | [user1@study ~]$ echo $$# |
判断变量是否为整数
方法一:使用expr做计算,判断命令执行返回值
1 | expr $1 + 1 &>/dev/null |
方法二:使用变量字符串替换的结果做条件判断
1 | num=2 |
方法三:使用shell正则做条件判断
1 | check_int(){ |
匹配指定格式的文件名
源码出自CentOS6.X系统的命令脚本:/usr/bin/ssh-copy-id
,用到了expr的表达式 expr STRING : REGEXP
,还需要注意 expr
命令最好使用绝对路径
1 | L_ID_FILE="~/.ssh/test.pub" |
字串 STRING 中一旦被正则表达式 REGEXP 匹配到,就返回匹配到的字符串的长度,否则返回 0
1 | [user1@study ~]$ a=test.txt |
判断字符串是否不为空
test "string"
等同于 [ "string" ]
等同于 [ -n "string" ]
1 | [user1@study ~]$ test "fdsa" && echo not null || echo 0 |
使用rename实现批量改文件名
将后缀名 .conf
的文件批量改为 .conf.bak
1 | [user1@study ~]$ ls *.conf |
将后缀名 .conf.bak
的文件改为 .conf
1 | [user1@study ~]$ ls *.conf.bak |
使用内置命令type取命令的路径
1 | [user1@study ~]$ type -path ssh |
检查域名是否被干扰
向根请求解析指定的域名,正常情况下根不会返回任何A记录,只会返回它所属下一级域的NS记录。如果 dig +short
返回的值为空则说明域名未被干扰,如果返回一个A记录的IP地址,说明域名在请求解析的途中被拦截或干扰。
1 | [user1@study ~]$ source_ip=192.168.127.123 |