变量的类型:
1. 自定义变量
定义变量: 变量名=变量值 变量名必须以字母或下划线开头,区分大小写 ip1=192.168.2.115
引用变量: $变量名 或 ${变量名}
查看变量: echo $变量名 set(所有变量:包括自定义变量和环境变量)
取消变量: unset 变量名
作用范围: 仅在当前shell中有效

2. 环境变量
定义环境变量: 方法一 export back_dir2=/home/backup
方法二 export back_dir1 将自定义变量转换成环境变量
引用环境变量: $变量名 或 ${变量名}
查看环境变量: echo $变量名 env 例如env |grep back_dir2
取消环境变量: unset 变量名
变量作用范围: 在当前shell和子shell有效
=======================================================
C语言 局部变量 vs 全局变量
SHELL 自定义变量 vs 环境变量
=======================================================
set 查看所有变量(包括自定变量和环境变量)
env(environment) 查看环境变量
=======================================================

案例:让crontab等工具它们使用的编辑器是vim,而不是默认的vi
# crontab -e
0 12 * * * ls //由于默认使用的是vi,所有没有颜色

# vim /etc/profile
export EDITOR=vim //设置默认的编辑器为vim
# source /etc/profile
# crontab -e //有颜色

系统环境变量:
留意的一些环境变量:(系统定义的) /etc/profile /etc/bashrc ~/.bashrc ~/.bash_profile

[root@xiaochen ~]# echo $PS1 //当前shell提示符
 [\u@\h \W]\$
 [root@xiaochen ~]# echo $HOSTNAME //当前主机名
 xiaochen.uplooking.com
 [root@xiaochen ~]# echo $USER //当前用户
 root
 [root@xiaochen ~]# echo $UID //当前用户的UID
 0
 [root@xiaochen ~]# echo $SHELL //当前使用的shell
 /bin/bash
 [root@xiaochen ~]# echo $HISTSIZE //历史命令保存条数
 1000
 [root@xiaochen ~]# echo $MAIL //当前用户邮件路径
 /var/spool/mail/root
 [root@xiaochen ~]# 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
 [root@xiaochen scripts]# echo $RANDOM //产生0-32767的随机值
 8018
 [root@xiaochen ~]# echo $(($RANDOM%100+1)) //产生0-100的随机数99/100+1
 [root@xiaochen ~]# echo $(($RANDOM%10)) //产生0-9的随机数

 [root@localhost ~]# echo $LANG
 zh_CN.utf8
 [root@localhost ~]# yum grouplist |grep -i chinese
 [root@localhost ~]# yum grouplist |grep -i "中文"
 中文支持 [zh]
 [root@xiaochen ~]# date
 2016年 02月 20日 星期六 00:24:45 CST

 [root@localhost ~]# LANG=C
 [root@localhost ~]# echo $LANG
 C
 [root@localhost ~]# yum grouplist |grep -i chinese
 Chinese Support [zh]
 [root@xiaochen ~]# date
 Sat Feb 20 00:24:24 CST 2016


 示例1:
 [root@alice bash]# cat var1.sh
 #test 自定义变量和环境变量的作用范围
 echo $url
 echo $USER
 echo $UID
 echo $SHELL
 echo "这个脚本的名字是:`basename $0`"

 [root@xiaochen /]# basename /etc/hosts //basename:用来取出文件名
 hosts

 测试:
 [root@alice bash]# url=www.baidu.com
 [root@alice bash]# echo $url
 www.baidu.com
 [root@alice bash]# sh var1.sh

 root
 0
 /bin/bash
 这个脚本的名字是:var1.sh

 示例2:
 [root@xiaochen scripts]# vim a.sh
 #!/bin/bash
 export x=1
 echo "IN a.sh"
 echo $x
 ./b.sh
 [root@xiaochen scripts]# vim b.sh
 #!/bin/bash
 echo "IN b.sh"
 echo $x
 测试1:
 [root@xiaochen scripts]# sh a.sh
 IN a.sh
 1
 a.sh: line 5: ./b.sh: 权限不够
 [root@xiaochen scripts]# chmod +x b.sh
 测试2:
 如果将a.sh中的export去掉,重新执行a.sh脚本
 测试3:
 在测试2的基础上,去掉b.sh的的 x 权限,但是还想要达到想要的显示结果

 3. 位置变量
 $1 $2 $3 $4 $5 $6 $7 $8 $9 ${10}

 4. 预定义变量
 $0 脚本名
 $* 所有的参数
 $@ 所有的参数
 $# 参数的个数
 $$ 当前进程的PID
 $! 上一个进程的PID
 $? 上一个命令的返回值

 [root@xiaochen ~]# echo $$ //查看当前shell的进程号
 8898

 示例1:
 # vim test.sh
 echo "第2个位置参数是$2"
 echo "第1个位置参数是$1"
 echo "第4个位置参数是$4"

 echo "所有参数是: $*"
 echo "所有参数是: $@"
 echo "参数的个数是: $#"
 echo "当前进程的PID是: $$"

 echo '$1='$1
 echo '$2='$2
 echo '$3='$3
 echo '$*='$*
 echo '$@='$@
 echo '$#='$#
 echo '$$='$$

 示例2:
 [root@alice Desktop]# vim 2.sh
 #!/bin/bash
 echo "PID for 2.sh: $$"
 echo "2.sh get \$A=$A from 1.sh"
 A=C
 export A
 echo "2.sh: \$A is $A"


 参考:影响bash shell的其它文件
 bash登录和欢迎信息
 /etc/issue 登录前显示的信息(本地登录) Ctrl+Alt+F2
 /etc/issue.net 登录前显示的信息(网络登录)
 /etc/motd 登录后显示的信息

 示例1:
 [root@directory1 ~]# vim /etc/ssh/sshd_config
 Banner /etc/issue.net
 [root@directory1 ~]# cat /etc/issue.net
 #Red Hat Enterprise Linux Server release 6.4 (Santiago)
 #Kernel \r on an \m
 fei root yonghu jinzhi denglu

 [root@directory2 ~]# ssh 172.16.130.132
 #Red HatEnterprise Linux Server release 6.4 (Santiago)
 #Kernel \r on an \m
 fei root yonghu jinzhi denglu
 root@172.16.130.132's password:

 示例2:
 [root@station103 ~]# cat /etc/motd
 +--------------------------------------------+
 | |
 | 你当前登录的是网站服务器!!! |
 | 小心您的操作!!! |
 | |
 +--------------------------------------------+

 [root@xiaochen ~]# 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
 +--------------------------------------------+
 | |
 | 你当前登录的是网站服务器!!! |
 | 小心您的操作!!! |
 | |
 +--------------------------------------------+


 变量的定义方式:
 1. 显式赋值
 变量名=变量值
 示例:
 ip1=192.168.1.251
 school="BeiJing uplooking"
 today1=`date +%F` //``和$()叫做命令替换
 echo $today1
 today2=$(date +%F)

 2. read 从键盘读入变量值
 read -p "提示信息: " 变量名
 read -p "请输入银行卡账号: " num
 read -p "请输入银行卡密码: " -t 5 -n 6 pass
 echo 账号$num 密码$pass  >> /tmp/haha.txt


 示例3:
 # vim first.sh
 #!/bin/bash
 read -p "请输入要创建的目录名: " back_dir1
 mkdir /tmp/$back_dir1
 echo "创建目录成功"
 # sh first.sh

 示例4:
 # vim ping2.sh
 #!/bin/bash
 read -p "Input IP: " ip
 ping -c2 $ip &>/dev/null
 if [ $? = 0 ];then
 echo "host $ip is ok"
 else
 echo "host $ip is fail"
 fi
 # chmod a+x ping2.sh
 # ./ping.sh

 示例5:使用read截获银行卡的帐号和密码
 [root@localhost scripts]# cat bank.sh
 #!/bin/bash
 read -p "please input your bank card account: " account
 stty -echo //隐藏显示,不显示输入的密码
 read -p "please input your bank card passwd:" -t 5 passwd
 stty echo //恢复正常
 echo
 echo "account:$account password:$passwd" >> /tmp/bank.txt
 echo "account:$account password:$passwd" |mail -s "hello success" alice@localhost

 stty -echo:隐藏显示,但是不影响命令执行之后的结果显示

 定义或引用变量时注意事项:
 " " 弱引用
 ' ' 强引用
 [root@xiaochen ~]# school=uplooking
 [root@xiaochen ~]# echo "${school} is good"
 uplooking is good
 [root@xiaochen ~]# echo '${school} is good'
 ${school} is good

 ` ` 命令替换 等价于 $() 反引号中的shell命令会被先执行
 [root@xiaochen ~]# touch `date +%F`_file1.txt
 [root@xiaochen ~]# touch $(date
+%F)_file2.txt

 [root@xiaochen ~]# disk_free3="df -Ph |grep '/$' |awk '{print $4}'" 错误
 [root@xiaochen ~]# disk_free4=$(df -Ph |grep '/$' |awk '{print $4}')
 [root@xiaochen ~]# disk_free5=`df -Ph |grep '/$' |awk '{print $4}'`