shell 和 bash 是一个意思。
1 bash 变量的概述
shell 是脚本语言 ,不需要提前编译,在执行的过程中编译,所见即所得。
php ,java主要用来实现功能,语言函数等多且复杂
shell 是用来简化系统管理操作 ,例如 添加一万个用户,如果采用useradd 手工添加太........,可以采用shell 脚本,批量添加
2 bash 变量与 变量的分类
2.1 什么是变量 与变量的分类
变量命名规则:
变量名必须以字母或下划线大头,名字中间只能以 数字,字母,下划线 组成;
变量名的长度不得超过255个字符;
变量名在有效的范围内 必须是唯一的;
在Bash中 变量的默认类型都是字符串型;
在任何 系统 中 ,目录名 ,文件名,变量名都要有含义。
变量按照 存储数据分类:
字符串; 整数; 浮点数;日期;
shell 中变量分类:
用户自定义变量,变量自定义的;
环境变量,这种变量中保存的是主要和系统环境相关的数据。变量可以自定义,但是对系统生效的环境变量名和变量作用是国定的;
位置参数变量,这种变量主要是用来向脚本中传递参数或数据的,变量名不能自定义,变量作用是固定的;
预定义变量,是bash中已经定义好的变量,变量名不能自定义,变量作用也是固定的;
2.2 用户自定义变量
变量的定义
x=5; name=“jie cao ”
[root@aliyun247 ~]# x=5
[root@aliyun247 ~]# name ="dddd"
-bash: name: command not found
[root@aliyun247 ~]# name="dddd"
变量的调用
echo $5
echo $name
[root@aliyun247 ~]# echo 5
5
[root@aliyun247 ~]# echo x
x
[root@aliyun247 ~]# echo $x
5
[root@aliyun247 ~]# echo $name
dddd
变量的叠加
x=${x}789
[root@aliyun247 ~]# x=${x}789
[root@aliyun247 ~]# echo $x
5789
[root@aliyun247 ~]# x="$x"1234
-bash: 51234: command not found
[root@aliyun247 ~]# echo "$x"12345
512345
变量的查看
set
选项 -u 如果设定此选项,调用未声明变量时会报错(默认无任何提示)
[root@aliyun247 ~]# echo $a
[root@aliyun247 ~]# set -u
[root@aliyun247 ~]# echo $a
-bash: a: unbound variable
删除变量
unset
[root@aliyun247 ~]# unset x
[root@aliyun247 ~]# unset name
2.3 环境变量
环境变量与用户自定义变量的区别?
环境变量是全局变量,用户自定义变量是局部变量。
自定义变量 只在当前bash 环境生效, 环境变量在父bash ,子bash 中都生效。
哪些是环境变量??
对系统生效的环境变量名和变量作用是固定的
设置环境变量:
export 变量名=变量值
或
变量名=变量值
export 变量名
查看环境变量
set
#查看所有变量
env
#查看环境变量
删除环境变量
unset 变量名
[root@aliyun247 ~]# bash
[root@aliyun247 ~]# pstree
init─┬─AliHids───8*[{AliHids}]
├─AliYunDun───8*[{AliYunDun}]
├─AliYunDunUpdate───6*[{AliYunDunUpdat}]
├─crond
├─gshelld───3*[{gshelld}]
├─9*[java───36*[{java}]]
├─java───38*[{java}]
├─java───33*[{java}]
├─6*[mingetty]
├─mysqld_safe───mysqld───29*[{mysqld}]
├─nginx───6*[nginx]
├─nrpe
├─nscd───7*[{nscd}]
├─ntpd
├─rsyslogd───3*[{rsyslogd}]
├─snmpd
├─sshd─┬─sshd───bash
│ └─sshd───bash───bash───pstree
└─udevd───2*[udevd]
[root@aliyun247 ~]# env
HOSTNAME=aliyun247
SHELL=/bin/bash
TERM=xterm
HISTSIZE=1000
SSH_CLIENT=59.109.32.90 55902 22
SSH_TTY=/dev/pts/1
USER=root
JRE_HOME=/usr/local/jdk/jre
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:
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin:/usr/local/mysql/bin:/root/bin
MAIL=/var/spool/mail/root
PWD=/root
LANG=en_US.UTF-8
HISTCONTROL=ignoredups
HOME=/root
SHLVL=2
LOGNAME=root
CVS_RSH=ssh
SSH_CONNECTION=59.109.32.90 55902 182.92.238.207 22
CLASSPATH=.:/usr/local/jdk/lib:/usr/local/jdk/jre/lib:
LESSOPEN=|/usr/bin/lesspipe.sh %s
G_BROKEN_FILENAMES=1
_=/bin/env
对系统环境 生效的 常用环境变量
hostname
#主机名
shell
#当前shell
term
#环境终端
histsize
#历史命令条数
ssh_client
#当前操作环境是用ssh连接的,这里记录客户端ip
ssh_tty
#ssh 连接的终端时pts/1
user
#当前登录用户
PATH 环境变量:系统查找命令的路径
echo $PATH
#查看path变量
PATH=${PATH}:/root/sh
#增加path变量的值
[root@aliyun247 ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin:/usr/local/mysql/bin:/root/bin
PS1环境变量 :命令提示符设置
[root@aliyun247 ~]# set $PS1
[root@aliyun247 ~]# echo $ps1
[root@aliyun247 ~]# echo $PS1
[\u@\h \W]\$
[root@aliyun247 ~]#
[\u@\h \W]\$ : 定义为输出格式
\d
#显示日期 格式为 星期 月 日
\H
#显示完整的主机名
\t
#显示24小时时间制 格式为 hh:mm:ss
\A
#显示24小时时间制时间 格式为 hh:mm
\u
#显示当前用户
\w
#显示当前用户所在目录的完整名称
\W
#显示当前用户所在目录的最后一个目录
\$
#提示符, 如果是root用户提示为 “#” 如果是普通用户提示为"$"
2.4 语系参数
当前语系查询
locale 命令 :查询当前系统内语系
LANG
#定义系统主语系变量
LC_ALL
#定义整体语系的变量
[root@aliyun247 ~]# locale
LANG=en_US.UTF-8
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=
语系变量LANG
locale -a | more
#查看linux支持的所有语系
[root@aliyun247 /]# locale -a | more
aa_DJ
aa_DJ.iso88591
aa_DJ.utf8
aa_ER
aa_ER.utf8
aa_ET
aa_ET.utf8
af_ZA
af_ZA.iso88591
af_ZA.utf8
am_ET
am_ET.utf8
an_ES
an_ES.iso885915
an_ES.utf8
ar_AE
ar_AE.iso88596
ar_AE.utf8
ar_BH
ar_BH.iso88596
ar_BH.utf8
ar_DZ
ar_DZ.iso88596
ar_DZ.utf8
ar_EG
ar_EG.iso88596
ar_EG.utf8
ar_IN
ar_IN.utf8
ar_IQ
ar_IQ.iso88596
ar_IQ.utf8
ar_JO
ar_JO.iso88596
ar_JO.utf8
ar_KW
查看系统默认语系
cat /etc/sysconfig/i18n
[root@aliyun247 ~]# cat /etc/sysconfig/i18n
LANG="en_US.UTF-8"
SYSFONT="latarcyrheb-sun16"
liunx 中文支持
前提条件是 正确安装的中文字体和中文语系
1: 如果 有图形界面,可以正确支持中文显示
2: 如果使用第三方远程工具,只要语系设置正确,可以支持中文显示
3:如果使用纯字符界面 必须使用第三方插件(如zhcon等)
2.5 位置参数变量
位置参数变量 | 作用 |
$n | n 为数字,$0代表命令本身,$1到$9代表从1到9个参数,10以上的参数需要大括号如 ${10} |
$* | 这边变量代表命令中所有参数,$*把所有参数都看出一个整体。 |
$@ | 这个变量也代表命令行中所有的参数,不过$@把每个参数都区分对待。 |
$# | 这个变量代表命令行中所有参数的个数 |
2.6 预定义 变量
预定义变量 | 作用 |
$? | 最后一次命令执行的返回状态。如果这个变量值为0,证明上一个命令正确执行;如果这个变量的值是非0(具体是哪一个数由命令自己决定),则证明上一个命令执行不正确 |
$$ | 当前进程的进程号(PID) |
$! | 后台运行的最后一个进程的进程号(PID) |
[root@aliyun247 ~]# $$
-bash: 7066: command not found
[root@aliyun247 ~]# $!
[root@aliyun247 ~]# ls $?
ls: cannot access 0: No such file or directory
[root@aliyun247 ~]# lse $?
-bash: lse: command not found
[root@aliyun247 ~]# $$
-bash: 7066: command not found
[root@aliyun247 ~]# $!
[root@aliyun247 ~]# echo $$
7066
[root@aliyun247 ~]# echo $!
[root@aliyun247 ~]# ls echo $?
ls: cannot access echo: No such file or directory
ls: cannot access 0: No such file or directory
[root@aliyun247 ~]#
接收键盘输入
read [选项] [变量名]
选项
-p
#提示信息 ,在等待read 输入时,输出提示信息
-t
#秒数 ,read命令一直等待用户输入,使用此选项可以指定等待时间
-n
#字符数,read 命令只接受指定的字符数,就会执行
-s
#隐藏输入的数据,适用于机密信息的输入 ,如密码等