目录
命令:
1.env 查看环境变量
2.set 显示系统中已经存在的shell变量,以及设置变量的新变量值
1、变量定义规定:
2、变量的分类:
1.用户自定义变量:
2.环境变量:
3.位置参数变量:
4.预定义变量:
用户自定义变量详解:
1)变量定义:
2)变量调用:
3)变量查看:
环境变量详解:
1)环境变量设置与删除:
2)系统默认环境变量:
查询PATH环境变量的值:
LANG语系变量
位置参数变量详解:
演示$?预定义变量:
演示$$预定义变量效果:
接收键盘输入:read
read命令实例演示:
-u 如果设定此选项,调用未声明的变量时会有提示 (-u开启,+u关闭)
-x 如果设定此选项,在命令执行之前,会吧命令先输出一次(-x 开启 +x关闭)
unset 变量名:关闭变量
用某个特定字符串代表不固定的内容就是变量。
(变量使用的是内存使用空间)
在shell中定义变量的格式为:
name=[value]
如果value没有指定,变量将被赋值为空字符串。
1)变量名称可以由字母、数字和下划线组成,但不能以数字开头。
2)在bash中,变量的默认类型都是字符串型。 如果要进行数值运算,则 必须修改指定变量类型为数值型。
3)变量用等号连接值,等号左右两边不能有空格。
4)变量的值如果有空格,需要使用单引号或双引号包括。 其中双引号括起 来的内容“$” “\” “`”(反引号)都拥有特殊含义,而单引号括起 来的内容都是普通字符。
5)在变量的值中,可以使用\转义符。
6)如果需要增加变量的值,那么可以进行变量值的叠加,不过变量需要用 双引号包含"$变量名"或用${变量名}包含变量名。
例:
7)如果是把命令的结果作为变量值赋予变量,则需要使用反引号或$()包含 命令。
例:
(把test的变量设置为date的值,unset是关闭变量的命令。)
8)在字符串中调用变量的值,需要加花括号。
这种变量是最常见的变量,由用户自由定义变量命名和变量的值。
在bash中预设了很多环境变量,在工作中我们可以直接调用这些变量。
环境变量的变量名可以自由定义,但一般对系统起作用的环境变量名是系统预先设定好的。 比如当前用户ID号(UID)、当前用户家目录(HOME)、前一个工作目录(OLDPWD)、还有最常用的PATH。
这里我们重点解释一下PATH变量,在Linux系统中,我们输入cd可以切换目录。 Linux系统是通过PATH变量来搜索命令的,系统会按照PATH变量里目录的顺序查找该命令,如果所有目录都没找到命令,则提示命令未找到(排除别名的情况下)。
这种变量主要是用来向脚本当中传递参数或数据的,变量名不能自定义,变量作用是固定的。
是bash中已经定义好的变量,变量名不能自定义,变量作用也是固定的。
(上列截图中分别演示了:变量名不能以数字开头:在等号的两边不能有空格:变量的值如果有空格则要使用引号包含)
定义变量name,输出变量name的值)
命令:set :显示系统中已经存在的shell变量,以及设置shell变量的新变量值。
set 【选项】
子选项:
-u:如果设定此选项,调用未声明的变量时会有提示(-u开启,+u关闭)。
-x:如果设定此选项,在命令执行之前,会把命令先输出一次(-x开启,+x关闭)。
例:
(用set命令,然后用grep命令找出name行。如果直接用set命令,会查询系统中所有变量,包含用户自定义变量和环境变量)
file是没定义过变量的,因此用echo输出的时候,输出结果为空。但如果我们定义一个变量为空的话。那么就会和未定义变量混淆。所以我们用set -u命令。命令执行后,如果确实没有定义变量的话那么就会报错)(如果想关闭此功能用set +u命令)
(如果设定了-x选项,会在每个命令执行之前,先把命令输出一次。)
变量删除:unset 变量名
(以上截图中,首先声明了变量age=18.然后用export命令声明为环境变量。之后用env命令找到age=18。证明环境变量声明成功。然后用【unset 变量名】格式删除变量。再次查找发现未找到age相关环境变量。)(env和set的区别是,set命令可以查看所有变量,而env命令只能查看环境变量。)(还可以使用export age=18的方式在声明环境变量的同时赋值,两种赋值方式都会在env和set中找到赋值变量,命令执行结果并无差别。)
[root@localhost ~]# env
HOSTNAME=localhost.localdomain #主机名
TERM=xterm #终端环境
SHELL=/bin/bash #当前shell
HISTSIZE=1000 #历史命令条数
SSH_CLIENT=192.168.21.251 2761 22 #当前操作环境。用ssh连接,这里标记了客户端IP。
QTDIR=/usr/lib64/qt-3.3 #环境变量相关配置
QTINC=/usr/lib64/qt-3.3/include #环境变量相关配置
SSH_TTY=/dev/pts/1 #ssh连接的终端是pts/1
USER=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;0。。。。。。。。。。。。。。。。
pf=01;36: #颜色相关设置
MAIL=/var/spool/mail/root #用户邮箱
PATH=/usr/lib64/qt3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin #PATH变量,系统查找命令的路径
PWD=/root #当前用户所在目录
LANG=zh_CN.UTF-8 #语系
SSH_ASKPASS=/usr/libexec/openssh/gnome-ssh-askpass #SSH相关配置
HISTCONTROL=ignoredups #此条目会删除历史命令中的重复命令。连续重复的命令,在历史命令中只会识别成一条。
SHLVL=1 #当前在第一层shell中。
HOME=/root #当前用户家目录
LOGNAME=root #当前用户名称
QTLIB=/usr/lib64/qt-3.3/lib #桌面相关环境变量
CVS_RSH=ssh #远程连接方式
SSH_CONNECTION=192.168.21.251 2761 192.168.21.44 22 #SSH连接的客户端IP和端口
LESSOPEN=|/usr/bin/lesspipe.sh %s #压缩包过滤相关环境变量
G_BROKEN_FILENAMES=1 #让GTK2使用LOCALES中的编码方式处理文件名
_=/bin/env #上次使用命令的最后一个参数或命令本身
env命令可以查询到所有的环境变量。 可是还有一些变量虽然不是环境变量,却是和bash操作接口相关的变量。 这些变量只能用set命令来查看了。
下面我们列出
set中重要内容:
[root@localhost ~]# set
BASH=/bin/bash #bash的位置
BASH_VERSINFO=([0]="4" [1]="1" [2]="2" [3]="1" [4]="release" [5]="x86_64-redhat-linux-gnu") #bash的版本
BASH_VERSION='4.1.2(1)-release' #bahs版本
COLORS=/etc/DIR_COLORS #颜色记录文件
HISTFILE=/root/.bash_history #历史文件保存位置
HISTFILESIZE=1000 #在文件中记录的历史命令 最大条数
HISTSIZE=1000 #在缓存中记录的历史命令最大 条数
HOME=/root #家目录位置
HOSTNAME=localhost.localdomain #主机名
HOSTTYPE=x86_64 #主机类型
ID=0 #用户ID
IFS=$' \t\n' #内部域分隔符
LANG=zh_CN.UTF-8 #语系环境
LESSOPEN='|/usr/bin/lesspipe.sh %s' #压缩包过滤相关环境变量
LINES=35
LOGNAME=root
MACHTYPE=x86_64-redhat-linux-gnu #软件类型是i386兼容类型
MAIL=/var/spool/mail/root #邮箱位置
MAILCHECK=60 #每60秒去扫描新邮件
PATH=/usr/lib64/qt3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
PPID=2543 #父shell的PID
PS1='[\u@\h \W]\$ ' #命令提示符
PS2='> ' #如果第一行命令没有输入完成,第二行命令的提示符
PS4='+ ' #“set -x"用来修改跟踪输出的前缀。(Shell脚本中使用select时的提示符)
PWD=/root #当前所在目录
UID=0 #当前用户的UIDPATH变量:系统查找命令的路径
【】# echo $PATH
/usr/lib64/qt3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
PATH变量的值是用:分割的路径,这些路径就是系统查找命令的路径。就是说当我们输入了一个命令后,如果没写路径,系统就会到PATH变量定义的路径中去寻找是否有可执行的程序。如果没有写入路径,则会返回“命令没有发现”的错误。那么也就就是说我们把自己的脚本拷贝到PATH变量定义的路径中,我们自己定义脚本也可以不输入路径而直接运行!
【】# vim hb.sh
[】# chmod 755 hb.sh
【】# cp /root/hb.sh /bin/
【】# cd /tmp/
【】]# hb.sh
ROUSHANN!!
(在上面实验中,我创建了一个hb.sh的脚本。然后赋予权限,复制到/bin/。切换目录之后,仍然能直接执行脚本。说明cp的方式可以直接将脚本添加至环境变量中。)
那么接下来,我们用变量叠加的方法试着修改PATH变量的值。达到相同的效果。(删除之前/bin/hb.sh)
【】# rm -rf /bin/hb.sh
【】# PATH="$PATH":/root/
[】# echo $PATH
/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin:/root/
[root@localhost tmp]# hb.sh
ROUSHANN!!
(首先删除了之前复制进/bin/目录的脚本。然后用变量叠加的方式在PATH中添加了/root/目录。接下来执行hb.sh成功。)
当然,我们这种定义PATH变量的方式只是临时生效,一旦重启或注销就会消失,如果想要永久生效,需要写入环境变量配置文件,我们在之后的课程中会详细介绍。
PS1变量:命令提示符设置
PS1变量是用来定义命令行提示符的,看可以按照我们自己的需求来定义自己喜欢的提示符。PS1支持的选项有:
\d:显示日期,格式为“星期 月 日”
\H:显示完整的主机名。如默认主机名:localhost.localdomain
\h:显示简写主机名。默认为:localhost
\T:显示12小时制时间,格式为HH:MM:SS
\t:显示24小时制时间,格式为HH:MM:SS
\A:显示24小时制时间,格式为HH:MM
\@:显示12小时制时间,格式为HH:MM am/pm
\u:显示当前用户名
\v:显示Bash的版本信息
\W:显示当前所在目录的最后一个目录
\w:显示当前所在目录的完整路径
\#:执行的第几个命令
\$:提示符。如果是root会显示提示符为“#”如果是普通用户会显示提示符为“$”
选项应用实例:
[root@localhost ~]# echo $PS1
[\u@\h \W]\$
[root@localhost ~]# PS1='[\u@\t \w]\$'
[root@22:52:10 ~]#cd /usr/local/src/
[root@22:52:21 /usr/local/src]#
(修改提示符为用户名@当前时间 当前所在目录完整路径)
这里需要注意:PS1变量的值要用单引号包含,否则设置不生效。
[root@22:52:21 /usr/local/src]#PS1='[\u@\@ \h \# \W]\$'[root@11:04 下午 localhost 29 src]#
(\@:时间格式是HH:MM: am/pm 、#:会显示执行了多少个命令)
LANG变量定义了Linux系统的主语系环境,这个变量的默认值是:
[root@localhost ~]#echo $LANG
zh_CN.UTF-8
(因为我们安装Linux时,选择的是中文安装。所以,默认的主语系变量是“zh_CH.UTF-8”)
我们可以用locale命令查询Linux中支持的语系数量:
因为Linux系统支持语系众多,我们直接统计数量即可:
[root@localhost src]#locale -a | wc -l
735
Linux系统支持那么多语系,想要查看当前所有语系可以用locale命令查看:
[root@localhost ~]#locale
LANG=zh_CN.UTF-8
。。。。。。。。。。。
LC_IDENTIFICATION="zh_CN.UTF-8"
LC_ALL=
Linux中文支持问题:不是说我们定义了语系为中文语系,如:zh_CN.UTF-8就可以显示中文了。要分情况而定。如果在图形界面中,或者用远程连接工具时,只要设置正确的语系就可以正常显示中文。当然,如果远程连接工具有可能也需要进行语系环境配置。如果强行更改LANG变量,那么最终结果会让原有格式变成乱码:
位置参数变量 |
作用 |
$n |
n为数字,$0代表命令本身,$1-$9代表第一到第九个参数,十以上的参数要用 大括号包含例 ${10} |
$* |
这个变量代表命令行中所有的参数,$*把所有的参数看成一个整体。 |
$@ |
这个变量代表命令行中所有参数,不过$@把每个参数区分对待 |
$# |
这个变量代表命令行中所有参数的个数。 |
首先,我们演示一下$n的作用:
#!/bin/bash
echo "$0"
echo "$1"
echo "$2"
echo "$3"
(写一个脚本)
【】#chmod +x chanshu.sh
[】#./chanshu.sh 11 22 33
./chanshu.sh11 22 33
(执行脚本,发现$0输出了命令的本身 $1输出了第一个数字11 $2输出了第二个数字22 $3输出了第三个数字33)
看起来这个位置参数变量并没有什么用处,但是可以实现简单的运算功能:
#!/bin/bash
aa=$1
bb=$2
cc=$((aa+bb))
echo "jieguoshi:$cc"
(编写了qiuhe.sh脚本)
【】#chmod 755 qiuhe.sh
【】#./qiuhe.sh 11 22
jieguoshi:33
(赋予执行权限,然后进行测试。脚本成功的计算出了11+22的和。位置参数变量的意义在于可以把值传进脚本,然后进行计算。)
【】# cat canshu4.sh
#!/bin/bash
echo "$*"
#首先我们编写了一个脚本,脚本分别输出$*、$@、$#。
echo "$@"
echo "$#"
【】# chmod 755 canshu4.sh
【】# ./canshu4.sh aa bb cc
aa bb cc
aa bb cc
3
(我们看到,$*和$@输出的结果相同似乎并没有什么区别。而$#输出了参数的个数是正确的。)
查看$*、$#区别的脚本。
[】# cat canshuan3.sh
#!/bin/bash
for i in "$*" #定义for循环,in后边有几个值,for会循环多少次。$* 要用双引号括起来。
do #每次循环都会把in后边的值赋予变量。
echo "$i" #shell把$*中的所有参数看成一个整体,所以这个for循环 只会循环一次。
done #打印$i的值。
for a in "$@" #in后边的有几个值for就会循环几次,每次都把赋值 给变量a
do #可是shell中把$@中的每个参数都看成是独立的,所以$@中有几个 参数,就会循环几次。
echo "$a" #输出变量a的值。
done
echo "$#" $#输出了参数的个数。
【】# chmod 755 canshuan3.sh
[】# ./canshuan3.sh a b c d
a b c d
a
b
c
d
4
(解释一下上边的脚本输出内容:
因为$*会把所有参数看成一个整体,所以只输出了a b c d。
因为$@会把变量中的参数分别对待,结合for循环。所以会分别输出,a b c d四个字母。而$#会算出命令行中参数的个数,我们输入了abcd,4个参数。)
预定义变量 |
作用 |
$? |
最后一次执行命令的返回状态。如果这个变量的值为0,证明上一个命令正确执行。如果这个变量的值为非0,则证明上一个命令不正确执行。 |
$$ |
当前进程的进程号(PID) |
$! |
后台运行的最后一个进程的进程号(PID) |
【】# ls #执行命令ls,执行成功。
keyring-xS41Gf orbit-gdm pulse-VtQdCFNyTe9r
keyring-ZPERjY pulse-9ubbx0KGoo8T virtual-root.pPc6Ff
#查看了/tmp下的内容。
【】# echo $? #执行echo $?
0 #返回值0说明命令执行功。
【】# lss #输入一个不存在的命令。
-bash: lss: command not found #报错,显示命令不存在。
【】# echo $? #执行echo $?
127 #非0命令执行不成功
(在命令执行成功后echo $?的返回值统一为0。当命令执行不成功值返回值为非0。具体数值为编程人员定义。)
【】# vim dangqian.sh #首先写一个脚本,dangqian.sh
】[# chmod 755 dangqian.sh #赋予执行权限。
【】# cat dangqian.sh #查看脚本内容。
#!/bin/bash
#echo $$输出了脚本的进程号。
echo "$$"
【】[# ./dangqian.sh
2073 #脚本运行时进程号。
(也可以直接在命令行中输出echo $$返回的进程号就是当前bash的进程号。可以通过ps aux验证。)
演示$!预定义效果:
【】# top & #把top命令放入后台执行
[1] 1967 #显示了top命令的进程号为1967
【】# ps aux #用top命令查看top进程和进程号
【】# echo $! #用echo $!命令查看进程号
1967
命令格式:read 【选项】 【变量名】
子选项:
-p “提示信息”:等待read输入时,输出提示信息。
-t 秒数:read命令会一直等待用户输入,使用此选项可以指定等待时间。
-n 字符数:read命令只接受指定的字符数量,然后就会执行。
-s 隐藏输入内容,适用于机密信息的输入。
变量名:
1.变量命名可以自定义,如果不指定变量名,会把输入保存入默认变量REPLY
2.如果只提供一个变量名,则整个输入行赋予该变量。
3.如果提供了一个以上的变量名,则输入行分为若干字,一个接一个地赋予各 个变量,而命令行上的最后一个变量取得剩余所有字。
[root@localhost ~]# cat xx.sh
#编写一个名为xx.sh的脚本
#!/bin/bash
read -t 30 -p "请输入姓名:" name
#等待30秒,提示信息为“姓名..”,赋予变量”name“read -t 30 -s -p "请输入年龄:" age
#等待30秒,隐藏输入内容提示信息为“年龄..”变量age
echo -e ""
#输入一个空行,没有的话在当前格式默认不换行。
read -t 30 -n 1 -p "请输入性别:" sex
#等待30秒,提示信息为性别..,字符数1,变量sex
echo -e ""
#输入一个空行,没有的话在当前格式默认不换行。
echo "$name"
#分别输出$name $age $sex
echo "$age"
echo "$sex"