脚本
test条件判断
test命令可用于评估bash脚本中的表达式。它评估其参数所指定的表达式,如果表达式为true,返回零退出状态,如果表达式为false,则返回非零退出状态。test具有替代语法,使用方括号"[]"将表达式括起来,这样更易于阅读。
语法:test EXPRESSION 或 [EXPRESSION]
非零或零长度字符串运算符:test -{n|z} STRING
test检测命令
-n 不为空
-z 为空
[root@server0 ~]# [ -n westos ]; echo $?
0 ##条件为空,与-n成立。(退出状态为0,表示前面条件成立)
[root@server0 ~]# [ -z westos ]; echo $?
1 ##条件不成立
[root@desktop39 ~]# a=1
[root@desktop39 ~]# [ -n a ];echo $?
0
[root@desktop39 ~]# [ -z a ];echo $?
1
1)
实验:
输入运行脚本,加ip时判断是否能ping通,不加时请求输入ip
[root@desktop39 ~]# cat /mnt/check_ip.sh
#!/bin/bash
[ -n "$*" ] &&(
ping -c1 -w1 $* &> /dev/null && echo $* is up || echo $* is down
)||(
echo "Please input an ipaddress:"
)
[root@desktop39 ~]# /mnt/check_ip.sh
Please input an ipaddress:
[root@desktop39 ~]# /mnt/check_ip.sh 172.25.254.39
172.25.254.39 is up
数字比较运算符:-eq 等于、-ne 不等于、-lt 小于、-le 小于等于、-gt 大于 、-ge 大于等于
2)
实验:
输入两个数,和10比较大小
[root@desktop39 ~]# cat /mnt/check_num.sh
#!/bin/bash
while
[ -z "$1" -o -z "$2"]
do
echo "Please give me two num after /mnt/check_num.sh"
exit 1
done
NUM=$[ $1 + $2 ]
if [ "$NUM" -ge "10" ]
then
echo "the result is over 10"
else
echo "the result is lower than 10"
fi
[root@desktop39 ~]# /mnt/check_num.sh 2 18
the result is over 10
[root@desktop39 ~]# /mnt/check_num.sh 2 7
the result is lower than 10
文件状态运算符:test -{b|c|e|f|d|r|w|x|s|L} FILE/DIRECTORY
- ##文件
[root@server0 ~]# [ -b /dev/sda ]; echo $? ##块设备
1
[root@server0 ~]# [ -c /dev/zero ]; echo $? ##字符设备
0
[root@server0 ~]# [ -e /etc/passwd ]; echo $? ##表示存在
0
[root@server0 ~]# [ -f /etc/passwd ]; echo $? ##常规文件
0
[root@server0 ~]# [ -d /etc/passwd ]; echo $? ##目录
1
[root@server0 ~]# [ -L /etc/passwd ]; echo $? ##链接
1
-S ##套接字
二进制文件运算符:-ef、-nt、-ot
-ef ##硬链接
-nt ##哪个文件更新(左比右)
-ot ##哪个文件更旧(左比右)
[root@server0 bin]# [ /bin/mount -ef /usr/bin/mount ]; echo $?
0
[root@server0 bin]# [ /bin/mount -nt /usr/bin/mount ]; echo $?
1
[root@server0 bin]# [ /bin/mount -ot /usr/bin/mount ]; echo $?
1
逻辑运算符:-o 或者、-a 并且、! 否定、&& 存在(之前的条件成立)、|| 不存在(条件不成立)
[root@server0 bin]# [ 2 -gt 1 -a 1 -gt 2 ]; echo $?
1
[root@server0 bin]# [ 2 -gt 1 -o 1 -gt 2 ]; echo $?
0
[root@server0 bin]# [ ! 2 -gt 1 ]; echo $?
1
3)
测试:
输入需要测试的文件,判断文件类型
#!/bin/bash
if
[ -z "$*" ]
then
echo "USE: /mnt/check_file.sh file|directory"
elif ##继续判断
[ ! -e "$*" ]
then
echo "$* is not exit!!"
elif
[ -L "$*" ]
then
echo "$* is a soft link" ##是个软链接
fi
同上,使用的相同的语法加入其他类型。
[root@desktop39 mnt]# /mnt/check_file.sh
USE: /mnt/check_file.sh file|directory
4)
测试:
查看用户是否建立,并更改密码为westos
#!/bin/bash
if
[ -z "$1" ]
then
echo please give me a userfile
elif
[ ! -e "$1" ]
then
echo "$1 is not exist!!"
else
for NAME in `cat $1`
do
USER=`getent passwd $NAME`
if
[ -z "$USER" ]
then
useradd $NAME
echo westos | passwd --stdin $NAME
else
echo $NAME is exist!!
fi
done
fi
[root@desktop39 mnt]# /mnt/user.sh
please give me a userfile
[root@desktop39 mnt]# /mnt/user.sh /mnt/userfile
Changing password for user user1.
passwd: all authentication tokens updated successfully.
Changing password for user user2.
passwd: all authentication tokens updated successfully.
Changing password for user user3.
passwd: all authentication tokens updated successfully.
5)
当脚本后面接create时,建立/mnt/userfile的用户,当脚本后面接delete,删除/mnt/userfile的用户。
#!/bin/bash
if
[ "$#" -lt "2" ]
then
echo "Usage: /mnt/ctrl_user.sh <create|delete> <userfile>"
fi
if
[ "$1" = "create" ]
then
if
[ -z "$2" ]
then
echo please give me a userfile
elif
[ ! -e "$2" ]
then
echo "$2 is not exist"
else
for NAME in `cat $2`
do
USER=`getent passwd $NAME`
[ -z $USER ]&&(
useradd $NAME &> /dev/null
echo westos | passwd --stdin $NAME &>/dev/null
)||(
echo "$NAME is exist"
)
done
fi
elif
[ "$1" = "delete" ]
then
if
[ -z "$2" ]
then
echo please give me a userfile
elif
[ ! -e "$2" ]
then
echo "$2 is not exist"
else
for NAME in `cat $2`
do
USER=`getent passwd $NAME`
[ -n $USER ]&&(
userdel -r $NAME &> /dev/null
)||(
echo "$NAME is not exist"
)
done
fi
fi
6)非交互连接指定ip
[root@localhost mnt]# cat autossh.exp
#!/usr/bin/expect
set ip [ lindex $argv 0 ]
spawn ssh root@$ip
expect {
"(yes/no)" {send "yes\r";exp_continue} ##exp_continue表示如果有这个问题,就回答,没有往下继续
"password: " {send "westos\r"}
}
interact
第一次连接:
[root@localhost mnt]# expect autossh.exp 172.25.254.40
spawn ssh root@172.25.254.40
The authenticity of host '172.25.254.40 (172.25.254.40)' can't be established.
ECDSA key fingerprint is 7d:08:66:0c:75:5c:8e:5b:26:53:3c:a0:df:28:63:ef.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '172.25.254.40' (ECDSA) to the list of known hosts.
root@172.25.254.40's password:
Last login: Sun Jun 18 07:25:57 2017 from foundation41.ilt.example.com
再次连接:
[root@localhost mnt]# expect autossh.exp 172.25.254.40
spawn ssh root@172.25.254.40
root@172.25.254.40's password:
Last login: Sun Jun 18 07:47:08 2017 from foundation139.ilt.example.com
[root@foundation40 ~]# ls
anaconda-ks.cfg rht-ks-post.log
foundation-config-post.log rht-ks-pre.log
[root@foundation40 ~]# exit
logout
Connection to 172.25.254.40 closed.
例7:expect的使用
yum install expect -y
[root@desktop38 ~]# vim /mnt/ask.sh
#!/bin/bash
read -p "Who are you: " NAME
read -p "How old are you: " AGE
read -p "what's you class: " CLASS
read -p "Are you happy: " FEEL
echo $NAME is $AGE old study $CLASS and feel $FEEL
[root@desktop38 ~]# vim answer.exp
#!/usr/bin/expect
set NAME [ lindex $argv 0 ] ##变量
set AGE [ lindex $argv 1 ]
set CLASS [ lindex $argv 2 ]
set FEEL [ lindex $argv 3 ]
spawn /mnt/ask.sh#监控/mnt/ask.sh
expect "Who"##\r换行
send "$NAME\r"
expect "How"
send "$AGE\r"
expect "class"
send "$CLASS\r"
expect "happy"
send "$FEEL\r:]"
expect eof ##退出expect
测试:
[root@desktop38 ~]# expect answer.exp
spawn /mnt/ask.sh
Who are you:
How old are you:
what's you class:
Are you happy:
is old study and feel
[root@desktop38 ~]# expect answer.exp lee 18 linux happy
spawn /mnt/ask.sh
Who are you: lee
How old are you: 18
what's you class: linux
Are you happy: happy
lee is 18 old study linux and feel happy
变量的种类:
用户级变量:只针对用户生效~/.bash_profile
系统级变量(先读):所有用户都生效/etc/profile
环境级变量(一次性):只在当前环境生效
用户自定义变量文件/mnt/.bash_profile去初始化它们的环境变量
环境变量
shell和脚本使用变量来存储数据 ,有些变量可以连同它们的内容传递给子进程,这些变量我们称之为环境变量。
在用户登录的时候,会运行全局变量文件/etc/profile,和用户自定义变量文件~/.bash_profile去初始化它们的环境变量。
例:使用export a=1,能够使bash下的子bash也识别该变量,但是,当该bash关闭后,再次登入后就识别不了
[root@localhost ~]# a=1
[root@localhost ~]# echo $a
1
[root@localhost ~]# vim file
[root@localhost ~]# sh file
[root@localhost ~]# export a=1
[root@localhost ~]# sh file
1
[root@localhost mnt]# exit
logout
Connection to 172.25.254.139 closed.
[root@foundation39 ~]# ssh root@172.25.254.139
root@172.25.254.139's password:
Last login: Sat Jun 17 19:36:23 2017 from 172.25.254.39
[root@localhost ~]# echo $a
[root@localhost ~]#
使用env命令显示所有环境变量
[root@localhost mnt]# env
XDG_SESSION_ID=52
HOSTNAME=localhost.localdomain
TERM=xterm-256color
SHELL=/bin/bash
HISTSIZE=1000
SSH_CLIENT=172.25.254.39 59619 22
SSH_TTY=/dev/pts/2
USER=root
LS_COLORS=rs=0:di=38;5;27:ln=38;5;51:mh=44;38;5;15:pi=40;38;5;11:so=38;5;13:do=38;5;5:bd=48;5;232;38;5;11:cd=48;5;232;38;5;3:or=48;5;232;38;5;9:mi=05;48;5;232;38;5;15:su=48;5;196;38;5;15:sg=48;5;11;38;5;16:ca=48;5;196;38;5;226:tw=48;5;10;38;5;16:ow=48;5;10;38;5;21:st=48;5;21;38;5;15:ex=38;5;34:*.tar=38;5;9:*.tgz=38;5;9:*.arc=38;5;9:*.arj=38;5;9:*.taz=38;5;9:*.lha=38;5;9:*.lz4=38;5;9:*.lzh=38;5;9:*.lzma=38;5;9:*.tlz=38;5;9:*.txz=38;5;9:*.tzo=38;5;9:*.t7z=38;5;9:*.zip=38;5;9:*.z=38;5;9:*.Z=38;5;9:*.dz=38;5;9:*.gz=38;5;9:*.lrz=38;5;9:*.lz=38;5;9:*.lzo=38;5;9:*.xz=38;5;9:*.bz2=38;5;9:*.bz=38;5;9:*.tbz=38;5;9:*.tbz2=38;5;9:*.tz=38;5;9:*.deb=38;5;9:*.rpm=38;5;9:*.jar=38;5;9:*.war=38;5;9:*.ear=38;5;9:*.sar=38;5;9:*.rar=38;5;9:*.alz=38;5;9:*.ace=38;5;9:*.zoo=38;5;9:*.cpio=38;5;9:*.7z=38;5;9:*.rz=38;5;9:*.cab=38;5;9:*.jpg=38;5;13:*.jpeg=38;5;13:*.gif=38;5;13:*.bmp=38;5;13:*.pbm=38;5;13:*.pgm=38;5;13:*.ppm=38;5;13:*.tga=38;5;13:*.xbm=38;5;13:*.xpm=38;5;13:*.tif=38;5;13:*.tiff=38;5;13:*.png=38;5;13:*.svg=38;5;13:*.svgz=38;5;13:*.mng=38;5;13:*.pcx=38;5;13:*.mov=38;5;13:*.mpg=38;5;13:*.mpeg=38;5;13:*.m2v=38;5;13:*.mkv=38;5;13:*.webm=38;5;13:*.ogm=38;5;13:*.mp4=38;5;13:*.m4v=38;5;13:*.mp4v=38;5;13:*.vob=38;5;13:*.qt=38;5;13:*.nuv=38;5;13:*.wmv=38;5;13:*.asf=38;5;13:*.rm=38;5;13:*.rmvb=38;5;13:*.flc=38;5;13:*.avi=38;5;13:*.fli=38;5;13:*.flv=38;5;13:*.gl=38;5;13:*.dl=38;5;13:*.xcf=38;5;13:*.xwd=38;5;13:*.yuv=38;5;13:*.cgm=38;5;13:*.emf=38;5;13:*.axv=38;5;13:*.anx=38;5;13:*.ogv=38;5;13:*.ogx=38;5;13:*.aac=38;5;45:*.au=38;5;45:*.flac=38;5;45:*.mid=38;5;45:*.midi=38;5;45:*.mka=38;5;45:*.mp3=38;5;45:*.mpc=38;5;45:*.ogg=38;5;45:*.ra=38;5;45:*.wav=38;5;45:*.axa=38;5;45:*.oga=38;5;45:*.spx=38;5;45:*.xspf=38;5;45:
MAIL=/var/spool/mail/root
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
PWD=/mnt
LANG=en_US.UTF-8
HISTCONTROL=ignoredups
SHLVL=1
HOME=/root
LOGNAME=root
SSH_CONNECTION=172.25.254.39 59619 172.25.254.139 22
LESSOPEN=||/usr/bin/lesspipe.sh %s
XDG_RUNTIME_DIR=/run/user/0
OLDPWD=/root
_=/usr/bin/env
使用别名
别名就是一直能够便捷的方式,以省去用户输入一长串命令序列的麻烦。
alias命令可以用来自定义属于自己的系统命令,写入~/.bashrc 文件永久生效。
设置别名:
# alias mycom='echo hello;hostname'
# mycomm
hello
server0.example.com
删除别名: 1.unalias mycomm
2.将其对应语句(如果有的话)从~/.bashrc中删除
3.或者使用命令alias example = ,这会取消名为example的别名
创建别名过程中,如果已经有同名的别名存在,那么原有的别名设置将被新的设置取代。
本文转自 yab109 51CTO博客,原文链接:http://blog.51cto.com/12768057/1940220,如需转载请自行联系原作者