• 幕客老师召集小伙伴
  • 运维高手36项修炼
  • python自动化运维项目实战
  • nginx从入门到实战
  • 阿里云与Centos7实战

SHELL环境

 知识点:

一、SHELL变量

二、影响bash shell 的配置文件

三、扩展部分:Bash SHELL特殊字符(元字符)

四、Bash SHELL脚本基础


SHELL变量
Bash SHELL配置文件
Bash SHELL特殊字符
Bash SHELL脚本基础
 

一、SHELL变量

作用: 用一个固定的字符串去表示一个不固定的值
设置、查看、引用、取消
变量明区分大小写
[root@jeson ~]# name1=111	//变量赋值

[root@jeson ~]# name2=222

[root@jeson ~]#
 

[root@jeson ~]# echo $name1	//引用变量111

[root@jeson ~]# echo $name
2222

[root@jeson ~]# echo ${name2}

222

[root@jeson ~]# unset name1	//取消变量

[root@jeson ~]# echo $name1

[root@jeson ~]# ip1=192.168.1.252

[root@jeson ~]# echo $ip1
192.168.1.252

[root@jeson ~]# ping $ip1

[root@jeson ~]# ip1=192.168.1.151	//重新赋值

[root@jeson ~]# echo $ip1

192.168.1.151

[root@jeson ~]# ping $ip1

[root@jeson ~]# school=Uplooking

[root@jeson ~]# echo $schoolUplooking

[root@jeson ~]# echo "$school1 is good"
 is good
[root@jeson ~]# echo "${school}1 is good"Uplooking1 is good

 

 
示例:脚本中使用变量
# vim if1.sh 
ping -c1 192.168.1.151

if[ $?=0 ];then 
        echo "host 192.168.1.151 is ok."
else 
        echo "host 192.168.1.151 is down!!!"fi
# vim if2.sh 
ip=192.168.1.251 
ping -c1 $ip 

if[ $?=0];then 
    echo "${ip} is up"
else 
    echo "${ip} is down!!!"
fi

 

 
双引号、单引号、反引号区别:(对变量的影响)
[root@jeson ~]# city=BeiJing

[root@jeson ~]# echo $city

BeiJing

[root@jeson ~]# echo "$city is good"	//弱引用
BeiJing is good
[root@jeson ~]# echo '$city is good'	//强引用
$city is good

[root@jeson ~]# today1="date +%F"	//非命令替换

[root@jeson ~]# echo $today1
date +%F
[root@jeson ~]# today2=`date +%F`	//命令替换

[root@jeson ~]# echo $today
22012-10-30

[root@jeson ~]# today3=$(date +%F)	//命令替换

[root@jeson ~]# echo $today3

2012-10-30

 

命令替换示例:
[root@jeson ~]# touch `date +%F`.aa.txt

[root@jeson ~]# ll 2012-10-30.aa.txt 
-rw-r--r--1 root root 010-3016:23 2012-10-30.aa.txt
[root@jeson ~]# touch $(date +%F).bb.txt

[root@jeson ~]# ll 2012-10-30.bb.txt

-rw-r--r--1 root root 010-3016:242012-10-30.bb.txt

 

 
=============================================
为什么要加引号???
[root@jeson scripts]# school=BeiJing Uplooking
bash:Uplooking: command not found
[root@jeson scripts]# 

[root@jeson scripts]# echo $school

[root@jeson scripts]# school="BeiJing Uplooking"

[root@jeson scripts]# echo $schoolBeiJingUplooking

如下方式,引起ls执行,可能出现错误隐患

# bb=welcome ls

2018-01-21.txt

=============================================
 
 
变量作用范围:
Linux 自定义变量    ---  环境变量
C语言 局部变量       ---  全局变量
 
自定义变量: 仅在当前shell生效!
环境变量:  在当前shell及子shell生效!
 
定义自定义变量:
[root@jeson ~]# ip1=192.168.2.115
 
定义环境变量:
[root@jeson ~]# ip2=1.1.1.1

[root@jeson ~]# export ip2	//将自定义变量ip2转换成环境变量
set  查看所有变量(包括自定变量和环境变量)
env 查看环境变量
====================================================
 
案例一:安装ORACLE前
[root@jeson ~]# useradd oracle

[root@jeson ~]# vim /home/oracle/.bash_profile
ORACLE_BASE=/u01
ORACLE_HOME=/u01/oradata
ORACLE_SID=db1
export ORACLE_BASE ORACLE_HOME ORACLE_SID
[root@jeson ~]# su - oracle

[oracle@jeson ~]$ env |grep ORACLE
ORACLE_SID=db1
ORACLE_BASE=/u01
ORACLE_HOME=/u01/oradata
 
案例二:让crontab等工具它们使用的编辑器是vim,而不是默认的vi
# crontab -e 012*** ls	//由于默认使用的是vi,所有没有颜色
# vim /etc/profile
export EDITOR=vim	//设置默认的编辑器为vim
# source /etc/profile

# crontab -e	//有颜色

 

====================================================
 
 
系统环境变量:
留意的一些环境变量:(系统定义的) /etc/profile /etc/bashrc   ~/.bashrc ~/.bash_profile
[root@jeson ~]# echo $PS1	//当前shell提示符[\u@\h \W]\$
[root@jeson ~]# echo $HOSTNAME	//当前主机名
jeson.uplooking.com
[root@jeson ~]# echo $USER	//当前用户
root
[root@jeson ~]# echo $UID	//当前用户的UID0
[root@jeson ~]# echo $SHELL	//当前使用的shell/bin/bash 
[root@jeson ~]# echo $HISTSIZE	//历史命令保存条数1000
[root@jeson ~]# echo $MAIL	//当前用户邮件路径/var/spool/mail/root
[root@jeson ~]# echo $PATH	//会影响命令搜索路径 /usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/X11R6/bin:/root/bin

 

二、影响bash shell 的配置文件

/etc/profile 系统级 login
/etc/bashrc   系统级 login
 
~/.bash_profile 用户级 login
~/.bashrc 用户级 login
~/.bash_history 用户级 loginout 退出bash时执行
~/.bash_logout 用户级   loginout 退出bash时执行
 
当用户登录后,可能取得shell是以下两种类型:
login shell 取shell时需要完整的登录过程(用户名、密码), su – alice
non-login shell 取得shell时不需要重复登录,例如图形下打开shell, su alice
 
login shell:        
1. /etc/profile 系统级别配置文件
2. ~/.bash_profile 用户级别配置文件 (用户自定义的环境变量) 
3. ~/.bashrc 用户级 (定义别名)
4. /etc/bashrc 系统级
 
non-login shell: 
1. ~/.bashrc     用户级
2. /etc/bashrc 系统级
====================================================
案例1: 给用户oracle设置环境变量
[root@jeson ~]# useradd oracle

[root@jeson ~]# vim ~oracle/.bash_profile
ORACLE_BASE=/u01
ORACLE_HOME=/u01/oradata
ORACLE_SID=db1
export ORACLE_BASE ORACLE_HOME ORACLE_SID

 

测试一:
[root@jeson ~]# su oracle	   //产生非登录shell

[oracle@jeson root]$ env |grep ORACLE
[oracle@jeson root]$ exit

 

 
测试二:
[root@jeson ~]# su - oracle    	//产生登录shell
[oracle@jeson ~]$ env |grep ORACLE
ORACLE_SID=db1
ORACLE_BASE=/u01
ORACLE_HOME=/u01/oradata

 

 
案例2: 给所有用户设置别名
[root@jeson ~]# tail -1 /etc/bashrc 
alias grep='grep --color'

[root@jeson ~]# su - oracle

[root@jeson ~]# grep root /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin

 

====================================================
 
参考:影响bash shell的其它文件
bash登录和欢迎信息
/etc/issue 登录前显示的信息(本地登录)
/etc/issue.net 登录前显示的信息(网络登录)
/etc/motd 登录后显示的信息
 
示例:
[root@station103 ~]# cat /etc/motd 

 

+——————————————–+
|                                 |
| 你当前登录的是网站服务器!!!     |
| 小心您的操作!!!               |
|                             |
+——————————————–+
 
[root@jeson ~]# ssh 192.168.2.3
root@192.168.2.3's password: 
Last login: Sun Mar 17 16:18:50 2013 from 192.168.2.80

 

+——————————————–+
|                                 |
| 你当前登录的是网站服务器!!!     |
| 小心您的操作!!!               |
|                             |
+——————————————–+
 
 

三、扩展部分:Bash SHELL特殊字符(元字符)

 

*   任意多个字符
?   任意一个字符
[root@jeson ~]# touch love lave
[root@jeson ~]# ll l*
-rw-r--r--1 root root 010-3112:09 lave
-rw-r--r--1 root root 010-3112:09 love
[root@jeson ~]# 
[root@jeson ~]# ll l?ve
-rw-r--r--1 root root 010-3112:09 lave
-rw-r--r--1 root root 010-3112:09 love
[root@jeson ~]# rm -rf *
[root@jeson ~]# rm -rf l*

 

 
[] 范围中的任意一个字符 [12] [ac] [a-z] [0-9]

 

[root@jeson ~]# touch love l1ve l2ve leve
[root@jeson ~]# ll l?ve
-rw-r--r--1 root root 003-1913:04 l1ve
-rw-r--r--1 root root 003-1913:04 l2ve
-rw-r--r--1 root root 003-1912:33 lave
-rw-r--r--1 root root 003-1913:04 leve
-rw-r--r--1 root root 003-1913:04 love
[root@jeson ~]# ll l[12]ve
-rw-r--r--1 root root 003-1913:04 l1ve
-rw-r--r--1 root root 003-1913:04 l2ve
[root@jeson ~]# ll l[0-9]ve
-rw-r--r--1 root root 003-1913:04 l1ve
-rw-r--r--1 root root 003-1913:04 l2ve
[root@jeson ~]#
 [root@jeson ~]# ll l[ad]ve
-rw-r--r--1 root root 003-1912:33 lave
[root@Jeson test]# touch lnve
[root@Jeson test]# ll l[ebn]ve
-rw-r--r--1 root root 0Aug2220:46 leve
-rw-r--r--1 root root 0Aug2220:48 lnve
[root@jeson ~]# ll l[a-z]ve
-rw-r--r--1 root root 003-1912:33 lave
-rw-r--r--1 root root 003-1913:04 leve
-rw-r--r--1 root root 003-1913:04 love
[root@jeson ~]# ll /dev/sd[a-z]*
brw-rw----.1 root disk 8,0Jan710:10/dev/sda
brw-rw----.1 root disk 8,1Jan710:10/dev/sda1
brw-rw----.1 root disk 8,2Jan710:10/dev/sda2
brw-rw----.1 root disk 8,3Jan710:10/dev/sda3
brw-rw----.1 root disk 8,4Jan710:10/dev/sda4
brw-rw----.1 root disk 8,5Jan710:10/dev/sda5

 

 
#文档中表示注释
\  转义字符            
[root@jeson ~]# mkdir "a b"
[root@jeson ~]# mkdir c\ d
[root@jeson ~]# echo $aaa
[root@jeson ~]# echo '$aa'
$aa
[root@jeson ~]# echo \$aa

 

$aa
|    管道
;    连接多个命令cd /home;ls     cd;eject
‘ ’  强引用(在单引号中都视为普通字符)
” ” 弱引用 (在双引号中保留变量)
` `命令替换  等价于 $()
$   引用变量时的前导符 $SHELL
~  当前用户的家目录  ~jack    cp /etc/hosts ~jack    cp ~jack/file1 /home 
/   目录层次 cd /home/jack

!   取反  find / ! -name grub.conf

 

[root@Jeson test]# ls
c  c d  d  file100.txxt  file.txt  l1ve  l2ve  leve  lnve  love  lve
[root@Jeson test]# find ./ ! -name love

 

 

 

> >> 输出重定向

< << 输入重定向

 

[root@Jeson test]# cat >file10.txt </dev/null 
[root@Jeson test]# cat file10.txt

 

{} # mkdir -p /dir/{dir2,dir3}
     # touch file{1..20}
     # cp -v /etc/hosts{,.bak}
     “/etc/hosts” -> “/etc/hosts.bak”
 
()   在子shell中执行 (umask 077)
[root@jeson work]# umask 0022
[root@jeson work]# (umask)
umask
[root@jeson work]# (umask 066;touch 600file.txt)

[root@jeson work]# ll 600file.txt -rw-------.1 root root 0Apr1519:18600file.txt
[root@jeson work]# umask 0022

 

 
$() 命令替换等价于`符号(反引号)
&   后台符
 
小知识:
将执行任务放入后台运行的几种方式:
(1)后台符 &
(2)Ctrl+Z fg+任务号、jobs -l查看任务
(3)screen方式 
 
命令排序,命令执行的判断
;     command1;  command2
&& command1 && command2 command1执行则command2执行,command1不成功则command2不执行
|| command1 || command2  ||与&&符号功能相反
 
 
 
测试
#ls /home;date
 
# ls /aaaaa; date     仅命令的排序,不管前面命令是否执行成功,后面命令都执行
ls: /aaaaa: 没有那个文件或目录
2012年 10月 31日 星期三 13:38:45 CST
 
# ls /aaaaa &&  date   只有当前面命令执行成功,后面才会执行
ls: /aaaaa: 没有那个文件或目录
 
# ls /aaaaa ||  date   只有当前面命令执行失败,后面才会执行
ls: /aaaaa: 没有那个文件或目录
2012年 10月 31日 星期三 13:41:07 CST
 
练习:判断/opt/jeson目录存不存在,存在则终端打印目录存在,否则建立目录。
ls /opt/jeson && echo “exist”||mkdir /opt/jeson
[root@Jeson ~]# ping -c3 192.168.1.50 ||ping -c3 192.168.1.51
[root@Jeson ~]# echo $?
 
扩展练习:
[root@jeson ~]# ls /home/dir2000 || mkdir -v /home/dir2000
ls:/home/dir2000:没有那个文件或目录
mkdir:已创建目录“/home/dir2000”
[root@jeson ~]# 
[root@jeson ~]# [ -d /home/dir3000 ] || mkdir -v /home/dir3000
mkdir:已创建目录“/home/dir3000”
[root@jeson ~]# 
[root@jeson ~]# [ -d /home/dir3000 ]
[root@jeson ~]# echo $?
0
[root@jeson ~]# [ -d /home/dir4000 ]
[root@jeson ~]# echo $?
1
[root@jeson httpd-2.2.11]# ./configure     && make     && make install
                                    $?==0             $?==0
[root@jeson ~]# date
2012年10月31日星期三13:50:12 CST
[root@jeson ~]# echo $?	
//查看前一个命令执行后的返回值0

 

 

四、Bash SHELL脚本基础

条件判断
if [ expression ]
then
statments
fi
 
 
if  [ -d /home ]
then 
      echo “/home exist”
fi
 
练习:在/tmp/test目录是否存在,不存在创建对应目录。
#!/bin/sh
#if 
if [ ! -d /tmp/test ]
then
mkdir /tmp/test
fi
 
 
for循环
for $var in
do
statments
done
 
#!/bin/sh

#for
var='1 2 3 4 5 6 7'

for i in $var
#for i in 1 2 3 4 5 6 7 8 9do
    echo -e "\n $i"done

 

 
练习:逐行列出home所有文件
#!/bin/sh                                                                                                                             
for i in `ls -a /home`
do
    echo “$i exist”
done
 
#!/bin/sh
#for list /home
var=`ls /home`
#var=$(ls /home)
for i in $var
do
  echo -e "\n $i is exist"
done

 

 
 
示例1:01.sh
[root@jeson scripts]# vim 01.sh 
cd /boot
pwd
ls -l vm*
[root@jeson scripts]# chmod a+x 01.sh 
[root@jeson scripts]# ./01.sh 
/boot
-rwxr-xr-x.1 root root 3986992Jun142012 vmlinuz-2.6.32-279.el6.x86_64
-r-xr-xr-x.1 root root 3986992Nov1516:23 vmlinuz-anaconda

 

示例2:if.sh
[root@jeson scripts]# vim if.sh 
#!/bin/bash#该脚本的作用....
ip=192.168.10.44
ping -c2 $ip &>/dev/null

if[ $?=0];then
echo "${ip} is up"
else
echo "${ip} is down!!!"
fi

 

 
示例3:for.sh
#!/bin/bash
for script for "user in jack alice robin rose"
do
echo "$user"
done

 

 
示例4:for02.sh
#!/bin/bash
#ping test
for i in {1..10}//i为变量名
do 
ip=192.168.10.${i}
ping -c2 $ip &>/dev/null
if[ $?=0];
then
echo "Host $ip is up"
else
echo "Host $ip is down"
done

 

 
 
作业:使用脚本创建100用户
用户名:user1,user2…user100
密码:   123
 
小提示:修改密码 echo 123 |passwd user1 –stdin

 

 

#!/bin/sh
#add a lot of user
#Jeson 2014-08-23
for i in{1..14} do
  username=user${i}
  grep -w ${username}/etc/passwd &>/dev/null
  if [ $? != 0 ];then
      useradd ${username}-d /opt/test/${username}&& echo 123|passwd ${username}--stdin
  fi
done

SHELL环境

Pingbacks已打开。

引用地址

暂无评论

发表评论