1、Bash变量
1.1什么是变量
例如:name,age
1.2变量命名规则
- 变量名必须以字母数字或下划线大头,变量不能以数字开始
- 变量名称不能大于255字符
- 变量名在有效的范围内必须是唯一的
- 在Bash中,变量的默认类型都是字符串型
说明
在任何系统中,目录名,文件名,变量名都要有含义
1.3变量的分类
- 用户自定义变量:变量是用户自定义的
- 环境变量:这种变量中主要保存的是和系统操作环境相关的数据。变量可以自定义,但是对系统生效的环境变量名和变量作用是固定的
- 位置参数变量:这种变量主要用来向脚本中传递参数或者数据的。变量名不能自定义,变量作用是固定的。
- 预定义变量:是Bash中一定定义好的变量,变量名不能自定义,变量作用也是固定的。
说明:
位置变量其实就是预定义变量
1.4定义变量
规则:
变量名=变量值
例如
x=5
name=“jie cao”
说明:
等号左右两侧不能有空格,否则会报错
使用双引号
1.5变量调用
语法
echo $变量名
例如:
echo $x
echo $name
说明
定义是不用$,调用时使用$
1.6变量叠加
x=123
x="$x"456
x=${x}789
1.7变量查看
set 查看系统中所有变量
选项
-u 如果设定此选项,调用未声明的变量时会报错(默认无任何提示)
[root@localhost home]# echo $a
[root@localhost home]# set -u
[root@localhost home]# echo $a
-bash: a: unbound variable
[root@localhost home]#
说明
例子中无法确认变量$a是否自定义过,如果没有使用-u选项,则执行$a不会报错
执行set查看系统所有的环境变量
[root@localhost home]# set
BASH=/bin/bash
BASHOPTS=checkwinsize:cmdhist:expand_aliases:extquote:force_fignore:hostcomplete:interactive_comments:login_shell:progcomp:promptvars:sourcepath
BASH_ALIASES=()
BASH_ARGC=()
BASH_ARGV=()
BASH_CMDS=()
BASH_LINENO=()
BASH_SOURCE=()
BASH_VERSINFO=([0]="4" [1]="1" [2]="2" [3]="1" [4]="release" [5]="x86_64-redhat-linux-gnu")
BASH_VERSION='4.1.2(1)-release'
COLORS=/etc/DIR_COLORS
COLUMNS=189
DIRSTACK=()
EUID=0
GROUPS=()
G_BROKEN_FILENAMES=1
HISTCONTROL=ignoredups
HISTFILE=/root/.bash_history
HISTFILESIZE=10000
HISTSIZE=10000
HOME=/root
HOSTNAME=localhost.localdomain
HOSTTYPE=x86_64
ID=0
IFS=$' \t\n'
LANG=zh_CN.UTF-8
LESSOPEN='||/usr/bin/lesspipe.sh %s'
LINES=40
LOGNAME=root
LS_COLORS='rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=01;05;37;41:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lz=01;31:*.xz=01;31:*.bz2=01;31:*.tbz=01;31:*.tbz2=01;31:*.bz=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.rar=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.axv=01;35:*.anx=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=01;36:*.au=01;36:*.flac=01;36:*.mid=01;36:*.midi=01;36:*.mka=01;36:*.mp3=01;36:*.mpc=01;36:*.ogg=01;36:*.ra=01;36:*.wav=01;36:*.axa=01;36:*.oga=01;36:*.spx=01;36:*.xspf=01;36:'
MACHTYPE=x86_64-redhat-linux-gnu
MAIL=/var/spool/mail/root
MAILCHECK=60
OLDPWD=/root
OPTERR=1
OPTIND=1
OSTYPE=linux-gnu
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
PIPESTATUS=([0]="0")
PPID=1793
PROMPT_COMMAND='printf "\033]0;%s@%s:%s\007" "${USER}" "${HOSTNAME%%.*}" "${PWD/#$HOME/~}"'
PS1='[\u@\h \W]\$ '
PS2='> '
PS4='+ '
PWD=/home
SELINUX_LEVEL_REQUESTED=
SELINUX_ROLE_REQUESTED=
SELINUX_USE_CURRENT_RANGE=
SHELL=/bin/bash
SHELLOPTS=braceexpand:emacs:hashall:histexpand:history:interactive-comments:monitor
SHLVL=1
SSH_CLIENT='192.168.50.111 49965 22'
SSH_CONNECTION='192.168.50.111 49965 192.168.50.115 22'
SSH_TTY=/dev/pts/3
TERM=xterm
UID=0
USER=root
_=--color=auto
colors=/etc/DIR_COLORS
[root@localhost home]# x=123
[root@localhost home]# x="$x"456
[root@localhost home]# set
BASH=/bin/bash
BASHOPTS=checkwinsize:cmdhist:expand_aliases:extquote:force_fignore:hostcomplete:interactive_comments:login_shell:progcomp:promptvars:sourcepath
BASH_ALIASES=()
BASH_ARGC=()
BASH_ARGV=()
BASH_CMDS=()
BASH_LINENO=()
BASH_SOURCE=()
BASH_VERSINFO=([0]="4" [1]="1" [2]="2" [3]="1" [4]="release" [5]="x86_64-redhat-linux-gnu")
BASH_VERSION='4.1.2(1)-release'
COLORS=/etc/DIR_COLORS
COLUMNS=189
DIRSTACK=()
EUID=0
GROUPS=()
G_BROKEN_FILENAMES=1
HISTCONTROL=ignoredups
HISTFILE=/root/.bash_history
HISTFILESIZE=10000
HISTSIZE=10000
HOME=/root
HOSTNAME=localhost.localdomain
HOSTTYPE=x86_64
ID=0
IFS=$' \t\n'
LANG=zh_CN.UTF-8
LESSOPEN='||/usr/bin/lesspipe.sh %s'
LINES=40
LOGNAME=root
LS_COLORS='rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=01;05;37;41:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lz=01;31:*.xz=01;31:*.bz2=01;31:*.tbz=01;31:*.tbz2=01;31:*.bz=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.rar=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.axv=01;35:*.anx=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=01;36:*.au=01;36:*.flac=01;36:*.mid=01;36:*.midi=01;36:*.mka=01;36:*.mp3=01;36:*.mpc=01;36:*.ogg=01;36:*.ra=01;36:*.wav=01;36:*.axa=01;36:*.oga=01;36:*.spx=01;36:*.xspf=01;36:'
MACHTYPE=x86_64-redhat-linux-gnu
MAIL=/var/spool/mail/root
MAILCHECK=60
OLDPWD=/root
OPTERR=1
OPTIND=1
OSTYPE=linux-gnu
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
PIPESTATUS=([0]="0")
PPID=1793
PROMPT_COMMAND='printf "\033]0;%s@%s:%s\007" "${USER}" "${HOSTNAME%%.*}" "${PWD/#$HOME/~}"'
PS1='[\u@\h \W]\$ '
PS2='> '
PS4='+ '
PWD=/home
SELINUX_LEVEL_REQUESTED=
SELINUX_ROLE_REQUESTED=
SELINUX_USE_CURRENT_RANGE=
SHELL=/bin/bash
SHELLOPTS=braceexpand:emacs:hashall:histexpand:history:interactive-comments:monitor
SHLVL=1
SSH_CLIENT='192.168.50.111 49965 22'
SSH_CONNECTION='192.168.50.111 49965 192.168.50.115 22'
SSH_TTY=/dev/pts/3
TERM=xterm
UID=0
USER=root
_=
colors=/etc/DIR_COLORS
x=123456
1.8变量删除
unset 变量名
说明:
删除的变量名前不能添加$
2、环境变量
环境变量与用户自定义变量的区别?
- 环境变量是全局变量
- 用户自定义变量是局部变量
- 用户自定义变量只能在当前shell中生效
- 环境变量在当前shell和这个shell的所有子shell中生效
在当前bash中输入bash命令,进入下一级bash
pstree 查看进行树
[root@localhost home]# bash
[root@localhost home]# pstree
init─┬─auditd───{auditd}
├─crond
├─dbus-daemon───{dbus-daemon}
├─master─┬─pickup
│ └─qmgr
├─6*[mingetty]
├─nginx───nginx
├─rsyslogd───3*[{rsyslogd}]
├─sshd─┬─2*[sshd───bash]
│ ├─sshd───bash───su───bash
│ └─sshd───bash───bash───pstree
└─udevd───2*[udevd]
设置环境变量方法
export z=1
或
变量名=变量值
export 变量名
查看环境变量
set:查看所有环境变量
env:查看环境变量,看不到本地变量
删除环境变量
unset 变量名
常用系统环境变量
- HOSTNAME:主机名
- SHELL:当前的shell
- TERM:终端环境
- HISTSIZE:历史命令条数
- SSH_CLIENT:当前操作环境是用ssh连接的,这里记录客户端ip
- SSH_TTY:ssh连接的终端时pts/1
- USER:当前登录的用户
说明:
建议大家把变量命名为大写字母表示
PATH环境变量
- PATH变量:系统查找命令的路径
- echo $PATH:查看PATH环境变量
- PATH=”$PATH”:/root/sh:增加PATH变量的值
PS1环境变量
PS1变量:命令提示符设置
- \d :显示日期,格式为“星期 月 日”
- \H :显示完整的主机名。如默认主机名“localhost.localdomain”
- \t:显示24小时制时间,格式为“HH:MM:SS”
- \A:显示24小时制时间,格式为“HH:MM”
- \u:显示当前用户名
- \w:显示当前所在目录的完整名称
- \W:显示当前所在目录的最后一个目录
- $:提示符。如果是root用户会显示提示为“#”,如果是普通用户会显示提示符为“$”
语系变量
命令:locale
说明:
查询当前系统语系
- LANG:定义系统主语系的变量
- LC_ALL:定义整体语系的变量
[root@localhost home]# locale
LANG=zh_CN.UTF-8
LC_CTYPE="zh_CN.UTF-8"
LC_NUMERIC="zh_CN.UTF-8"
LC_TIME="zh_CN.UTF-8"
LC_COLLATE="zh_CN.UTF-8"
LC_MONETARY="zh_CN.UTF-8"
LC_MESSAGES="zh_CN.UTF-8"
LC_PAPER="zh_CN.UTF-8"
LC_NAME="zh_CN.UTF-8"
LC_ADDRESS="zh_CN.UTF-8"
LC_TELEPHONE="zh_CN.UTF-8"
LC_MEASUREMENT="zh_CN.UTF-8"
LC_IDENTIFICATION="zh_CN.UTF-8"
LC_ALL=
补充:
- echo $LANG :查看系统当前语系,系统当前环境中生效的语系环境
- locale -a | more :查看linux支持的所有语系
- cat /etc/sysconfig/i18n:查看系统默认语系,下次开机之后系统默认的语系环境
Linux中文支持
前提条件,正确安装的中文字体和中文语系
- 如果有图形界面,可以正确支持中文显示
- 如果使用第三方远程工具(例如xshell),只要语系设定正确,可以支持中文显示
- 如果使用纯字符界面,必须使用第三方插件(例如zhcon等支持)
位置参数变量
位置参数变量 | 作用 |
---|---|
$n | n为数字,$0代表命令本身,$1-$9代表第一到第九个参数,十以上的参数需要用大括号包含,如${10} |
$* | 这个变量代表命令行中所有的参数,$*把所有的参数看成一个整体 |
$@ | 这个变量也代表命令行中所有的参数,不过$@把每个参数区分对待 |
$# | 这个变量代表命令行中所有参数的个数 |
例子1
位置变量的测试,从命令行中获取参数的值赋予num1和num2,并加和打印出结果
#!/bin/bash
#从命令行中获得第一个参数赋值给num1 获得第二个参数赋值给num2
num1=$1
num2=$2
#变量sum的和是num1加num2
sum=$(($num1 + $num2))
#打印变量sum的值
echo $sum
执行结果
[root@localhost sh]# chmod 755 canshu1.sh
[root@localhost sh]# ./canshu1.sh 11 22
33
说明:
命令./canshu1.sh 赋值给 $0
11 赋值给 $1
22 赋值给 $2
例子2
#!/bin/bash
#$* 测试示例
echo "\$* can shu shi : $*"
#$@ 测试示例
echo "\$@ can shu shi : $@"
#$# 测试示例
echo "\$# can shu ge shu shi : $#"
~
~
执行结果
[root@localhost sh]# chmod 755 canshu2.sh
[root@localhost sh]# ./canshu2.sh 11 22 33 44
$* can shu shi : 11 22 33 44
$@ can shu shi : 11 22 33 44
$# can shu ge shu shi : 4
例子3:$* 与 $@的区别
#!/bin/bash
#$*中的所有参数看成一个整体,所以这个for循环只会循环一次
for i in "$*"
do
echo "The parameters is : $i"
done
#$@中的每个参数都看成是独立的,所以"$@"中有几个参数,就循环几次,返回所有参数的名称
#要用双引号
for y in "$@"
do
echo "Parameter:$y"
done
执行结果
[root@localhost sh]# ./canshu3.sh aa bb cc dd
The parameters is : aa bb cc dd
Parameter:aa
Parameter:bb
Parameter:cc
Parameter:dd