一、变量命名
1、只能包含字母、数字和下划线,并且不能以数字开头,
2、不应该跟系统中已有的环境变量重名
3、命名要有含义
二、变量赋值
变量名称=值var_name=value 等号两边不能有空格
[root@hao ~]# NAME= jerry [root@hao ~]# echo $NAME jerry
三、bash:变量类型
1、环境变量
脚本在执行时会启动一个子shell进程。命令行中启动的脚本会继承当前shell环境变量,也就是说环境变量的作用域为当前shell进程及其子shell进程。系统自动执行的脚本(非命令行启动)则需要自我定义各环境变量。可以使用export设置环境变量。
export VARNAME=VALUE 或者 VARNAME=VALUE export VARNAME
[root@hao ~]# NAME= jerry [root@hao ~ ]# export NAME [root@hao ~]# echo $NAME jerry [root@hao ~ ]# bash [root@hao ~]# echo $NAME jerry [root@hao ~ ]# bash [root@hao ~]# echo $NAME jerry
[root@hao ~]# pstree
init-+-NetworkManager-+-dhclient
...
|-sshd---sshd---sshd---bash--- su---bash---bash---bash---pstree
|-udevd---2*[udevd]
`-wpa_supplican
2、本地变量(局部变量)
变量一定是进程的变量,因此在一个shell中声明的变量在其他的shell中不可用,并且在其子shell中也不可以得到。引用变量要加${varname},也可以不加{}。
[root@hao ~]# NAME= jerry [root@hao ~]# echo $NAME jerry [root@hao ~ ]# bash [root@hao ~]# echo $NAME [root@hao ~ ]# exit exit [root@hao ~]# echo $NAME jerry
本地变量:VARNAME=VALUE,作用域:整个bash进程。
局部变量 :local VARNAME=VALUE,作用域:当前代码段。
3、位置变量
$n
例:写一个脚本,能接受一个参数(文件路径),判定此参数是否是一个存在的文件,如果是就显示“ok”
[root@hao ~]# nano filetest. sh [root@hao ~]# cat filetest. sh # ! /bin/ bash # if [ -e $ 1 ]; then echo " ok " else echo " no such file " fi [root@hao ~]# chmod +x filetest. sh [root@hao ~]# ./filetest. sh /etc/ fstab ok [root@hao ~]# ./filetest. sh /etc/ fstabs no such file
shift, 每次shift都会剔除一个参数 shift n表示剔除n 个
[root@hao ~]# nano filetest1. sh [root@hao ~]# cat filetest1. sh # !/bin/ bash echo $ 1 shift echo $ 1 shift echo $ 1 [root@hao ~]# chmod +x filetest1. sh [root@hao ~]# ./filetest1. sh 1 2 3 1 2 3
4、特殊变量(系统变量)
用来保存某些特殊数据:
$?: 保存上一个命令的执行状态返回值(0-255)。0为正确,其他为错误。其中1,2,127系统预留,其他的可以自定义。
[root@hao ~]# ls / var account crash db games lib lock mail opt run tmp yp cache cvs empty gdm local log nis preserve spool www [root@hao ~]# echo $? 0 [root@hao ~]# ls / varr ls : cannot access /varr: No such file or directory [root@hao ~]# echo $? 2
如果只想看返回的状态值而不想看输出结果,则只需将输出重定向至数据黑洞/dev/null
[root@hao ~]# ls /varr &> /dev/ null [root@hao ~]# echo $? 2
$#:参数的个数
$*:参数列表
$@:参数列表(与上面的有不同)
例:写一个脚本,能接受一个参数(文件路径),判定此参数是否是一个存在的文件,如果是就显示“ok”
[root@hao ~]# nano filetest. sh [root@hao ~]# cat filetest. sh # ! /bin/ bash # echo $# echo $* echo $@ if [ $# -lt 1 ]; then echo " Usage:./filetest.sh ARG1 ARG2 ... " exit 7 fi if [ -e $ 1 ]; then echo " ok " else echo " no such file " fi [root@hao ~]# chmod +x filetest. sh [root@hao ~]# ./filetest. sh 0 Usage:. /filetest. sh ARG1 ARG2 ...
[root@hao ~]# ./filetest.sh /etc/fstab /etc/fstabs
2
/etc/fstab /etc/fstabs
/etc/fstab /etc/fstabs
ok
四、撤销变量
[root@hao ~ ]# unset NAME [root@hao ~]# echo $NAME
五、查看当前shell变量
查看当前shell所有变量,包含环境变量和本地变量
[root@hao ~ ]# set BASH =/bin/ bash BASHOPTS = checkwinsize:cmdhist:expand_aliases:extquote:force_fignore:hostcomplete:interactive_comments:login_shell:progcomp:promptvars:sourcepath BASH_ALIASES = () ...
查看当前shell环境变量 printenv env 或者export
[root@hao ~ ]# printenv HOSTNAME = hao SHELL =/bin/ bash TERM = xterm ...
六、追加shell变量
[root@hao ~]# ANIMAL= pig [root@hao ~]# ANIMAL= $ANIMAL:goat [root@hao ~]# echo $ANIMAL pig:goat [root@hao ~]# echo $PATH /usr/lib64/qt- 3.3 /bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/ bin [root@hao ~]# export PATH=$PATH:/usr/local/apache/ bin [root@hao ~]# echo $PATH /usr/lib64/qt- 3.3 /bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin:/usr/local/apache/ bin [root@hao ~]# export PATH=/usr/local/mysql/ bin:$PATH [root@hao ~]# echo $PATH /usr/local/mysql/bin:/usr/lib64/qt- 3.3 /bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin:/usr/local/apache/bin
七、第一个脚本程序
首先创建脚本程序first.sh,脚本程序的第一行要指定程序的魔数,#!加上解释器的路径。然后赋予其执行权限,之后执行,执行时候要加上路径,因为在没有给路径时,默认去path中去找该命令是否存在。
[root@hao ~]# cat first. sh # !/bin/ bash ls / var cat /etc/ inittab [root@hao ~]# chmod +x first. sh [root@hao ~]# ./first. sh account crash db games lib lock mail opt run tmp yp cache cvs empty gdm local log nis preserve spool www # inittab is only used by upstart for the default runlevel. # # ADDING OTHER CONFIGURATION HERE WILL HAVE NO EFFECT ON YOUR SYSTEM. # # System initialization is started by /etc/init/ rcS.conf # # Individual runlevels are started by /etc/init/ rc.conf # # Ctrl -Alt-Delete is handled by /etc/init/control-alt- delete.conf # # Terminal gettys are handled by /etc/init/tty.conf and /etc/init/ serial.conf, # with configuration in /etc/sysconfig/ init. # # For information on how to write upstart event handlers, or how # upstart works, see init( 5 ), init( 8 ), and initctl( 8 ). # # Default runlevel. The runlevels used are: # 0 - halt (Do NOT set initdefault to this) # 1 - Single user mode # 2 - Multiuser, without NFS (The same as 3 , if you do not have networking) # 3 - Full multiuser mode # 4 - unused # 5 - X11 # 6 - reboot (Do NOT set initdefault to this) # id : 5 :initdefault: