shell编程之变量的笔记

前言

参考视频shell编程之变量
参考网站菜鸟教程
shell编程之环境变量配置文件的笔记shell编程之环境变量配置文件的笔记

一.Bash变量概述

1.shell基础

有关shell基础内容请查看Linux基础(一)的笔记的shell基础

2.shell与其它语言相比

  • php和java主要是实现功能
  • shell简化管理操作

二、Bash变量与变量分类

1.Bash变量与变量分类

(1)什么是变量

  • 变量是计算机内存的单元,其中存放的值可以改变
  • 变量让你能够把程序中准备使用的每一段数据都赋给一个简短、易于记忆的名字,因此它们十分有用

(2)变量命名规则

  • 变量名必须以字母或下划线开头,名字中间只能由字母、数字和下划线组成
  • 变量名的长度不得超过255个字符
  • 变量名在有效的范围内必须是唯一的
  • 在Bash中,变量的默认类型都是字符串类型

建议:起名字最好有含义

(3)变量按照存储数据分类

  • 字符串型
  • 整型
  • 浮点型
  • 日期型

(4)变量的分类

  • 用户自定义变量。
  • 环境变量:这种变量中主要保存的是和系统操作环境相关的数据。变量可以自定义,但是对系统生效的环境变量名和变量作用是固定的
  • 位置参数变量:这种变量主要是用来向脚本当中传递参数或数据的,变量名不能自定义,变量作用是固定的
  • 预定义变量:是Bash中已经定义好的变量,变量名不能自定义,变量作用也是固定的

2.用户定义变量

(1)定义变量

变量名=变量值
例如:
	x=5
[root@jueshadb ~]# name = 123
-bash: name: 未找到命令
[root@jueshadb ~]# name=123
[root@jueshadb ~]# 123aaa=23123
-bash: 123aaa=23123: 未找到命令
[root@jueshadb ~]# _aaa=23123
#只读变量
[root@jueshadb ~]# name=123
[root@jueshadb ~]# readonly name
[root@jueshadb ~]# name=77
-bash: name: 只读变量

注意:等号两边不能有空格;如果有特殊字符使用双引号;定义变量前面不能有$;加上readonly就变量只读变量

(2)调用变量

echo $变量名
例如:
	echo $name

#输出变量值
[root@jueshadb ~]# name=123
[root@jueshadb ~]# echo $name
123

#虽然赋的值是数字123,但它实际是字符串类型
[root@jueshadb ~]# name=$name+6
[root@jueshadb ~]# echo $name
123+6

调用变量前面要有$;重复定义的变量会覆盖之前的变量值;

(3)变量叠加

name=123
#第一种使用双引号
name="$name"456
#第二种使用花括号
name=${name}789
[root@jueshadb ~]# name=123
[root@jueshadb ~]# echo $name
123
[root@jueshadb ~]# name="$name"456
[root@jueshadb ~]# echo $name
123456
[root@jueshadb ~]# name=${name}789
[root@jueshadb ~]# echo $name
123456789
#不要直接叠加,不然会认为是某个变量名,就把该变量的值赋予name
[root@jueshadb ~]# name=$name0000
[root@jueshadb ~]# echo $name

建议:变量叠加时使用双引号或者花括号,不要直接叠加,不然会认为是某个变量名,最好使用双引号,毕竟好区分

(4)变量查看

set 
	选项:
		-u 如果设定此选项,调用未声明变量时会报错(默认无提示)

set可以查看所有正在运行的变量

(5)变量删除

unset 变量名
在这里插入代码片
[root@jueshadb ~]# unset name

注:unset变量名前面不用加$

3.环境变量

(1)环境变量与用户自定义变量的区别

  • 环境变量是全局变量
  • 用户自定义变量是局部变量
  • 用户自定义变量只在当前的shell中生效
  • 环境变量在当前shell和这个shell的所有子shell中生效
  • 变量可以自定义,但是对系统生效的环境变量名和变量作用是固定的

如果没有pstree命令,执行“yum -y install psmisc”安装;若如:sshd───sshd───bash───pstree 则表示父shell若出现两个bash 则表示子shell 中 如:sshd───sshd───bash───bash───pstree

注:如果在父shell中创建了一个环境变量name,在其子shell中也可对name进行操作,因为是环境变量,但是在其子shell中删除了name(unset name),那么在子shell中name变量就不再存在了!但是exit退回到父shell中变量name依然还是存在的

(2)设置环境变量

export 变量名=变量值
或
变量名=变量值
export 变量名
[root@jueshadb ~]# export name="test"
[root@jueshadb ~]# env
XDG_SESSION_ID=371
HOSTNAME=jueshadb.localdomain
SHELL=/bin/bash
TERM=xterm
HISTSIZE=100
SSH_CLIENT=192.168.8.207 52749 22
SSH_TTY=/dev/pts/0
name=test
USER=root
NAME=123
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:*.arc=01;31:*.arj=01;31:*.taz=01;31:*.lha=01;31:*.lz4=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.tzo=01;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.alz=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.cab=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:*.webm=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:
TMOUT=600
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
MAIL=/var/spool/mail/root
PWD=/root
LANG=zh_CN.UTF-8
HISTCONTROL=ignoredups
HOME=/root
SHLVL=2
LOGNAME=root
SSH_CONNECTION=192.168.8.207 52749 192.168.8.197 22
LESSOPEN=||/usr/bin/lesspipe.sh %s
XDG_RUNTIME_DIR=/run/user/0
HISTTIMEFORMAT=%F %T root
_=/usr/bin/env

变量名建议大写

(3)查看环境变量

#查看所有变量
set 
#查看环境变量
env
	

(4)调用和删除环境变量跟用户定义变量的删除一样
(5)常用环境变量

  • HOSTNAME:主机名
  • SHELL:当前shell
  • TERM:终端环境
  • HISTSIZE:历史命令条数
  • SSH_CLIENT:当前操作环境是ssh连接的,这里记录客户终端ip
  • SSH_TTY:ssh连接的终端是pts/1
  • USER:当前登录用户
  • PATH:系统查找命令的路径

(6)PATH环境变量

echo $PATH
#查看PATH环境变量
PATH="$PATH":/root/sh
#增加PATH变量的值

为什么有些命令不需要绝对路径或者相对路径就可以直接执行,是因为它在PATH环境变量里,参考windows的环境变量

(7)PS1环境变量

PS1变量:命令提示符设置
	- \d 显示日期,格式为“星期 月 日”
	- \H 显示完整的主机名。如默认主机名“localhost.localdomain”
	- \t 显示24小时制时间,格式为“HH:MM:SS”
	- \A 显示24小时制时间,格式为“HH:MM”
	- \u 显示当前用户名
	- \w 显示当前所在目录的完整名称
	- \W 显示当前所在目录的最后一个目录
	- \$ 提示符。如果是root用户会显示提示符为“#”,普通用户会显示提示符为“$”

4.语系变量

(1)当前语系查询

#查询当前系统语系
locale
	- LANG 定义系统主语系的变量
	- LC_ALL 定义整体语系的变量
[root@jueshadb ~]# 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=

(2)语系变量LANG

echo $LANG
#查询系统当前语系
locale -a | more
#查看Linux支持的所有语系

(3)查询系统默认语系

#Centos 6
cat /etc/sysconfig/i18n
#Centos 7
cat /etc/locale.conf

(4)Linux中文支持

  • 前提条件,正确安装的中文字体和中文语系
    • 如果有图形界面,可以正确支持中文显示
    • 如果使用第三方远程工具,只有语系设定正确,可以支持中文显示
    • 如果使用纯字符界面,必须使用第三方插件(如zhcon等)

5.位置参数变量

(1)位置参数变量

位置参数变量作用
$nn为数字,$0表示命令本身,$1-$9表示第一个到第九个参数,十以上的参数需要使用大括号包含,如$[10]
$*这个变量代表命令行中所有的参数,$*把所有的参数看成一个整体
$@这个变量也代表命令行中所有的参数,不过$@把每个参数区分对待
$#这个命令代表命令行中所有参数的个数

(2)例子1
新建1.sh文件

#!/bin/bash
num1=$1
num2=$2
#变量sum的和是num1加num2,$num1 + $num2需要括号括起来
sum=$(($num1 + $num2))
#打印变量sum的值
echo $sum                   

执行

[root@jueshadb param]# chmod +x 1.sh
[root@jueshadb param]# ./1.sh  1 2
3

(3)例子2
新建2.sh文件

#!/bin/bash
#使用$#代表所有参数的个数
echo "参数个数为:$#"
#使用$*代表所有的参数
echo "参数为:$*"
#使用$@代表所有的参数
echo "参数为:$@"               

执行

[root@jueshadb param]# chmod +x 2.sh
[root@jueshadb param]# ./2.sh 1 2 3
参数个数为:3
参数为:1 2 3
参数为:1 2 3

(4)例子3:$*与$@的区别
新建3.sh文件


#!/bin/bash
#注意:必须用双引号括起来,因为for循环的in后面有几个就循环几次

#$*中的参数都看成一个整体,所以“$*”的只循环一次
for i in "$*"

do
        echo "参数为:$i"
done


#$@中的每个参数都看成独立的,所以“$@”中有几个参数,就会循环多少次
for y in "$@"
do
        echo "参数为:$y"
done

[root@jueshadb param]# ./3.sh 1 2 3 4 5
参数为:1 2 3 4 5
参数为:1
参数为:2
参数为:3
参数为:4
参数为:5

6.预定义变量

(1)预定义变量

预定义变量作用
$?最后一次执行的命令返回状态。如果这个变量的值为0,证明上一个命令正确执行,如果这个变量的值非0(具体是哪个值,由命令自己决定),证明上一个命令执行不正确
$$当前进程的进程号(PID)
$!后台运行的最后一个进程的进程号(PID)

(2)例子

#$?
[root@jueshadb param]# ls
1.sh  2.sh  3.sh
[root@jueshadb param]# echo $?
0
#$$
[root@jueshadb param]# echo $$
26578
#$!,如果后台有运行程序的话就会有值
[root@jueshadb param]# echo $!


(3)接收键盘输入

read  [选项] [变量名]
选项:
	-p "提示信息":在等待read输入时,输出提示信息
	-t 秒数:read命令会一直等待用户输入,使用此选项可以指定等待时间
	-n 字符数:read命令只接受指定的字符数就会执行
	-s 隐藏输入的数据
[root@jueshadb param]# read -p "请输入:" -t 10 -n 20 -s name
请输入:
[root@jueshadb param]# echo $name
12321321


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值