shell--bash变量

目录

命令:

1.env  查看环境变量

2.set  显示系统中已经存在的shell变量,以及设置变量的新变量值

1、变量定义规定:

2、变量的分类:

1.用户自定义变量:

2.环境变量:

3.位置参数变量:

4.预定义变量:

用户自定义变量详解:

1)变量定义:

2)变量调用:

3)变量查看:

环境变量详解:

1)环境变量设置与删除:

2)系统默认环境变量:

查询PATH环境变量的值:

LANG语系变量

位置参数变量详解:

演示$?预定义变量:

演示$$预定义变量效果:

接收键盘输入:read

read命令实例演示:


命令:

1.env  查看环境变量

2.set  显示系统中已经存在的shell变量,以及设置变量的新变量值

-u  如果设定此选项,调用未声明的变量时会有提示 (-u开启,+u关闭)

-x  如果设定此选项,在命令执行之前,会吧命令先输出一次(-x 开启 +x关闭)

unset 变量名:关闭变量

用某个特定字符串代表不固定的内容就是变量。

(变量使用的是内存使用空间)

在shell中定义变量的格式为:

name=[value]

如果value没有指定,变量将被赋值为空字符串。

1、变量定义规定:

1)变量名称可以由字母、数字和下划线组成,但不能以数字开头。

2)在bash中,变量的默认类型都是字符串型。 如果要进行数值运算,则 必须修改指定变量类型为数值型。

3)变量用等号连接值,等号左右两边不能有空格。

4)变量的值如果有空格,需要使用单引号或双引号包括。 其中双引号括起     来的内容“$” “\” “`”(反引号)都拥有特殊含义,而单引号括起      来的内容都是普通字符。

5)在变量的值中,可以使用\转义符。

6)如果需要增加变量的值,那么可以进行变量值的叠加,不过变量需要用     双引号包含"$变量名"或用${变量名}包含变量名。

例:

shell--bash变量_第1张图片

7)如果是把命令的结果作为变量值赋予变量,则需要使用反引号或$()包含     命令。

例:

shell--bash变量_第2张图片

(把test的变量设置为date的值,unset是关闭变量的命令。)

8)在字符串中调用变量的值,需要加花括号。

2、变量的分类:

1.用户自定义变量:

这种变量是最常见的变量,由用户自由定义变量命名和变量的值。

2.环境变量:

在bash中预设了很多环境变量,在工作中我们可以直接调用这些变量。

环境变量的变量名可以自由定义,但一般对系统起作用的环境变量名是系统预先设定好的。 比如当前用户ID号(UID)、当前用户家目录(HOME)、前一个工作目录(OLDPWD)、还有最常用的PATH。

这里我们重点解释一下PATH变量,在Linux系统中,我们输入cd可以切换目录。 Linux系统是通过PATH变量来搜索命令的,系统会按照PATH变量里目录的顺序查找该命令,如果所有目录都没找到命令,则提示命令未找到(排除别名的情况下)。

3.位置参数变量:

这种变量主要是用来向脚本当中传递参数或数据的,变量名不能自定义,变量作用是固定的。

4.预定义变量:

是bash中已经定义好的变量,变量名不能自定义,变量作用也是固定的。

用户自定义变量详解:

1)变量定义:

shell--bash变量_第3张图片

(上列截图中分别演示了:变量名不能以数字开头:在等号的两边不能有空格:变量的值如果有空格则要使用引号包含)

2)变量调用:

定义变量name,输出变量name的值)

3)变量查看:

命令:set :显示系统中已经存在的shell变量,以及设置shell变量的新变量值。

set 【选项】

子选项:

-u:如果设定此选项,调用未声明的变量时会有提示(-u开启,+u关闭)。

-x:如果设定此选项,在命令执行之前,会把命令先输出一次(-x开启,+x关闭)。

例:

(用set命令,然后用grep命令找出name行。如果直接用set命令,会查询系统中所有变量,包含用户自定义变量和环境变量)

file是没定义过变量的,因此用echo输出的时候,输出结果为空。但如果我们定义一个变量为空的话。那么就会和未定义变量混淆。所以我们用set -u命令。命令执行后,如果确实没有定义变量的话那么就会报错)(如果想关闭此功能用set +u命令)

shell--bash变量_第4张图片

(如果设定了-x选项,会在每个命令执行之前,先把命令输出一次。)

变量删除:unset 变量名

环境变量详解:

1)环境变量设置与删除:

shell--bash变量_第5张图片

(以上截图中,首先声明了变量age=18.然后用export命令声明为环境变量。之后用env命令找到age=18。证明环境变量声明成功。然后用【unset 变量名】格式删除变量。再次查找发现未找到age相关环境变量。)(env和set的区别是,set命令可以查看所有变量,而env命令只能查看环境变量。)(还可以使用export age=18的方式在声明环境变量的同时赋值,两种赋值方式都会在env和set中找到赋值变量,命令执行结果并无差别。)

2)系统默认环境变量:

[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变量:系统查找命令的路径

查询PATH环境变量的值:

【】# 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语系变量

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变量,那么最终结果会让原有格式变成乱码:

shell--bash变量_第6张图片

shell--bash变量_第7张图片

位置参数变量详解:

位置参数变量

作用

$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

命令格式:read 【选项】 【变量名】

子选项:

-p “提示信息”:等待read输入时,输出提示信息。

-t  秒数:read命令会一直等待用户输入,使用此选项可以指定等待时间。

-n  字符数:read命令只接受指定的字符数量,然后就会执行。

-s  隐藏输入内容,适用于机密信息的输入。

变量名:

1.变量命名可以自定义,如果不指定变量名,会把输入保存入默认变量REPLY

2.如果只提供一个变量名,则整个输入行赋予该变量。

3.如果提供了一个以上的变量名,则输入行分为若干字,一个接一个地赋予各    个变量,而命令行上的最后一个变量取得剩余所有字。

read命令实例演示:

[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"

你可能感兴趣的:(shell基础,bash,运维,服务器,linux)