变量的类型:
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}'`