Linux Shell编程(2) - Bash 变量
一、简介与分类
1. Bash 变量的命名规则
- 变量名只能包含字母、数字、下划线
- 变量名不能以数字作为开头
- 变量名区分大小写
- 变量名长度不超过255个字符
- 变量名在有效范围内必须唯一
2. 变量按照存储的数据类型分类
在Bash中,变量的默认类型都是字符串型
- 字符串型
- 整型
- 浮点型
- 日期型
3. 变量的分类
用户自定义变量
- 用户自己定义的变量名
环境变量
- 环境变量主要保存的是和系统操作环境相关的数据。
- 变量可以自定义,但是对系统生效的环境变量名和变量作用是固定的。
位置参数变量
- 位置参数变量主要是用来向脚本当中传递参数或数据的。
- 变量名不能自定义,变量作用是固定的。
预定义变量
- 预定义变量是 bash 中已经定义好的便令。
- 变量名不能自定义,变量作用是固定的。
二、用户自定义变量
1. 定义变量
语法
变量名="变量值"
说明
- 等号两边不能有空格
- 当变量值中间有空格时,要用引号包裹变量值
- 变量的默认类型都是字符串型
- 变量只在当前的 bash 中生效
实例
[root~]# age=18
[root~]# name="zhang san"
2. 变量调用
语法
$变量名
说明
- 调用变量需要在变量名前加
$
- 变量的默认类型都是字符串型,所以无法直接做
+
,-
等运算操作 - 赋值时引用变量,可使用
"$变量名"
或${变量名}
- 赋值时引用变量,若要在值两边使用引号,则必须使用
双引号
,若使用单引号,则单引号内的变量不会转换成变量值
实例
- 调用变量需要在变量名前加
$
[root~]# echo $name
zhang san
- 变量的默认类型都是字符串型,所以无法直接做
+
,-
等运算操作
[root~]# x=1
[root~]# y=2
[root~]# z=$x+$y
[root~]# echo $z
1+2
- 赋值时引用变量,可使用
"$变量名"
或${变量名}
[root~]# a=hel
[root~]# b="$a"lo
[root~]# echo $b
hello
- 当变量值中间有空格时,要用引号包裹。赋值时引用变量,必须使用
双引号
[root~]# c="${b} world"
[root~]# echo $c
hello world
- 赋值时引用变量,若使用单引号,则单引号内的变量不会转换成变量值
[root~]# d='${b} world'
[root~]# echo $d
${b} world
3. 变量叠加
实例
[root~]$x=123
[root~]$echo $x
123[root~]$x=${x}456
[root~]$echo $x
123456[root~]$x="$x"789
[root~]$echo $x
123456789
4. 变量查看
语法
set [选项]
选项
-u
:如果设定此项,调用未声明的变量时会报错(默认无任何提示)
实例
m
赋值为空字符串,n
未定义。默认情况下,echo$m
和$n
,都没有任何提示
[root~]# m=''
[root~]# echo m
m
[root~]# echo $m[root~]# echo $n
set -u
后,echo $n
会报错
[root~]# set -u
[root~]# echo $m[root~]# echo $n
bash: n: unbound variable
5. 变量删除
语法
unset 变量名
实例
[root~]# set -u[root~]# x=hello
[root~]# echo $x
hello[root~]# unset x
[root~]# echo $x
bash: x: unbound variable
三、环境变量
1. 环境变量和用户自定义变量的区别
环境变量是全局变量;
用户自定义变量是局部变量。用户自定义变量只在当前shell中生效;
环境变量在当前shell和这个shell的所有自shell中生效。
2. 设置环境变量
export 变量名=变量值
或
变量名=变量值
export 变量名
实例
[root~]# export xxx=env
[root~]# env | grep xxx
xxx=env[root~]# yyy=env
[root~]# export yyy
[root~]# env | grep yyy
yyy=env
[root~]# yyy=yyy
[root~]# env | grep yyy
yyy=yyy
3. 查看环境变量
set:查看所有变量env:只查看环境变量
实例
[root~]# env
XDG_SESSION_ID=2
HOSTNAME=10.0.2.15
SHELL=/bin/bash
TERM=cygwin
HISTSIZE=1000
OLDPWD=/home/vagrant
USER=root
LS_COLORS=rs=0:di=01;34:ln=01;36:mh=00 ... 36:*.xspf=00;36:
SUDO_USER=vagrant
SUDO_UID=1001
USERNAME=root
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAIL=/var/spool/mail/vagrant
PWD=/root
LANG=en_US.UTF-8
SHLVL=1
SUDO_COMMAND=/bin/su
HOME=/root
LOGNAME=root
LESSOPEN=||/usr/bin/lesspipe.sh %s
SUDO_GID=1001
_=/bin/env
4. 删除环境变量
unset 变量名
环境变量在当前shell和这个shell的所有自shell中生效。在子shell中删除或者修改环境变量,并不能影响父shell中的环境变量
实例
- 定义环境变量
xxx
和yyy
[root~]# export xxx=xxx
[root~]# export yyy=yyy
[root~]# env
xxx=xxx
yyy=yyy
- 进入子shell,环境变量
xxx
和yyy
依然有效
[root~]# bash
[root~]# env
xxx=xxx
yyy=yyy
... 省略其他环境变量 ...
- 在子shell中删除
xxx
,并修改yyy
的值
[root~]# unset xxx
[root~]# yyy=zzz
[root~]# env
yyy=zzz
... 省略其他环境变量 ...
- 回到父shell,
xxx
和yyy
的值没受影响
[root~]# exit
[root~]# env
xxx=xxx
yyy=yyy
... 省略其他环境变量 ...
5. 常用的环境变量
环境变量 | 说明 |
---|---|
HOSTNAME | 主机名 |
SHELL | 当前的shell |
TERM | 终端环境 |
HISTSIZE | 历史命令条数 |
SSH_CLIENT | 当前操作环境是使用ssh连接的,这里记录客户端IP |
SSH_TTY | ssh连接的终端 pts/1 |
USER | 当前登录的用户 |
PATH | 系统查找命令的路径 |
PS1 | 命名提示符设置。env命令不会输出该环境变量 |
HOSTNAME=10.0.2.15
SHELL=/bin/bash
TERM=cygwin
HISTSIZE=1000
SSH_CLIENT=10.0.2.2 8432 22
SSH_TTY=/dev/pts/0
USER=vagrant
PATH=/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/vagrant/.local/bin:/home/vagrant/bin
PATH 环境变量
系统查找命令的路径
- 查看 PATH 环境变量
[root~]# echo $PATH
/sbin:/bin:/usr/sbin:/usr/bin
- 增加 PATH 环境变量
[root~]# PATH="$PATH":/usr/share/bin
[root~]# echo $PATH
/sbin:/bin:/usr/sbin:/usr/bin:/usr/share/bin
注意这种修改方法只在当前shell中生效,若想永久生效,必须修改环境变量配置文件。
PS1 环境变量
命令提示符设置
- 常用提示符说明
\d
:显示日期,格式为 “星期 月 日”
\H
:显示完整的主机名,如 “localhost”
\t
:显示24小时制时间,格式为 “HH:MM:SS”
\A
:显示24小时制时间,格式为 “HH:MM”
\u
:显示当前用户名
\w
:显示当前所在目录的完整名称
\W
:显示当前所在目录的最后一个目录
\$
:提示符,如果是root用户会显示“#”,普通用户会显示“$”
- 实例
[root~]# PS1='[\d]'
[Mon May 28]PS1='[\H]'
[10.0.2.15]PS1='[\t]'
[09:51:09]PS1='[\A]'
[09:51]PS1='[\u]'
[root]PS1='[\w]'
[~]PS1='[\W]'
[~]PS1='[\$]'
[#]PS1='[\[\e[1;31m\]\u\[\e[1;34m\]\w\[\e[0m\]]\$ '
[root~]#
注意这种修改方法只在当前shell中生效,若想永久生效,必须修改环境变量配置文件。
6. 语系变量
查看当前系统的语系
locale
LANG:定义系统主语系的变量
LC_ALL:定义整体语系的变量
- 实例
[root~]# 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
- 查看系统当前语系
[root~]# echo $LANG
en_US.UTF-8
- 查看系统支持的所有语系
[root~]# locale -a | more
aa_DJ
aa_DJ.iso88591
aa_DJ.utf8
aa_ER
...省略n行...
ar_SY
ar_SY.iso88596
ar_SY.utf8
ar_TN
ar_TN.iso88596
--More--
查询系统默认语系
/etc/locale.conf # CentOS7/etc/sysconfig/i18n # CentOS6
- 实例
[root~]# cat /etc/locale.conf
LANG="en_US.UTF-8"
四、位置参数变量
1. 常用位置参数变量
位置参数变量 | 作用 |
---|---|
$n
|
n为数字,$0 代表命令本身,$1 -$9 代表第一个到第九个参数,十以上的参数需要用大括号括起来,如 ${10}
|
$*
|
这个变量代表命令行中所有的参数,$* 把所有的参数看成一个整体
|
$@
|
这个变量代表命令行中所有的参数,$@ 把每个参数区分对待
|
$#
|
这个变量代表命令行中参数的个数 |
2. $n
- 创建一个加法运算的shell脚本
[root/tmp]# vim eg1.sh#!/bin/bashnum1=$1
num2=$2# 变量sum是num1加num2的和
sum=$(( $num1 + $num2 ))# 输出变量sum的值
echo $sum
- 运行shell脚本
[root/tmp]# chmod a+x eg1.sh[root/tmp]# ./eg1.sh 3 2
5
3. $0
,$*
,$@
,$#
[root/tmp]# vim eg2.sh#!/bin/bashecho "\$0 命令是:$0"echo "\$* 参数是:$*"echo "\$@ 参数是:$@"echo "\$# 参数个数是:$#"
- 运行shell脚本
[root/tmp]# chmod a+x eg2.sh[root/tmp]# ./eg2.sh 1 2 3 4 5
$0 命令是:./eg2.sh
$* 参数是:1 2 3 4 5
$@ 参数是:1 2 3 4 5
$# 参数个数是:5[root/tmp]# ./eg2.sh 7 8 9
$0 命令是:./eg2.sh
$* 参数是:7 8 9
$@ 参数是:7 8 9
$# 参数个数是:3
4. $*
与 $@
的区别
[root/tmp]# vim eg3.sh#!/bin/bashecho "\$*中的所有参数看成是一个整体,所以这个for循环只会循环一次"for m in "$*"doecho "参数是:$m"doneecho -e "\n--------------------------------------------------------\n"echo "\$@中的每个参数都看成是独立的,所以“$@”中有几个参数,就会循环几次"for n in "$@"doecho "参数是:$n"done
- 运行shell脚本
[root/tmp]# chmod a+x eg3.sh[root/tmp]# ./eg3.sh 1 2 3 4 5
$*中的所有参数看成是一个整体,所以这个for循环只会循环一次
参数是:1 2 3 4 5--------------------------------------------------------$@中的每个参数都看成是独立的,所以“1 2 3 4 5”中有几个参数,就会循环几次
参数是:1
参数是:2
参数是:3
参数是:4
参数是:5
五、预定义变量
1. 常用预定义变量
预定义变量 | 作用 |
---|---|
$?
|
最后一次执行的命令的返回状态。 如果这个变量的值为0,说明上一个命令正确执行; 如果这个变量的值为非0(具体数值,有命令自己决定),说明上一个命令执行不正确。 |
$$
|
当前进程的进程号(PID) |
$!
|
后台运行的最后一个进程的进程号(PID) |
2. $?
:最后一次执行的命令的返回状态
[root/tmp]# ls
eg1.sh eg2.sh eg3.sh
[root/tmp]# echo $?
0[root/tmp]# cat eg
cat: eg: No such file or directory
[root/tmp]# echo $?
1[root/tmp]# lll
bash: lll: command not found
[root/tmp]# echo $?
127
3. $$
:当前进程的进程号(PID)
[root/tmp]# echo $$
4311
[root/tmp]# vim bl.sh#!/bin/bashecho "当前进程PID:$$"[root/tmp]# chmod a+x bl.sh[root/tmp]# ./bl.sh
当前进程PID:4382
4. $!
:后台运行的最后一个进程的进程号(PID)
[root/tmp]# find / -name hello &
[1] 4408[root/tmp]# echo $!
4408[root/tmp]# echo $!
4408
[1]+ Done find / -name hello
六、read
接收键盘输入
1. 命令
read [选项] [变量名]
2. 选项
-p 提示信息
:在等待用户输入时,输出的提示信息
-t 秒数
:指定等待用户输入的时长(秒),不设置的话会一直等待用户输入
-n 字符数
:最多输入字符数,当用户输入指定字符数时,就会自动执行
-s
:隐藏用户输入的数据,适用于保密信息的输入
3. 实例
[root/tmp]# vim read.sh#!/bin/bash# 等待30秒
read -p '请输入你的用户名:' -t 30 name
echo $name# 隐藏输入内容
read -p '请输入你的密码:' -s passwd
echo -e '\n'
echo $passwd# 最多只能输入一个字符
read -p '请输入你的性别 [M/F]:' -n 1 sex
echo -e '\n'
echo $sex
[root/tmp]# ./read.sh
请输入你的用户名:Mr.wang
Mr.wang
请输入你的密码:123456
请输入你的性别 [M/F]:MM
Linux Shell编程(2) - Bash 变量相关推荐
- Linux Shell 编程学习总结
Shell 教程 Shell简介:什么是Shell,Shell命令的两种执行方式 Shell本身是一个用C语言编写的程序,它是用户使用Unix/Linux的桥梁,用户的大部分工作都是通过Shell完成 ...
- linux实验三shell程序设计,实验三 LINUX SHELL编程
精选文库 -实验三LINUX SHELL 编程 四.实验内容 本实验包含两个具体的SHELL程序编写任务,较为全面地涉及了SHELL 程序的设计方法和技术.内容如下: 1.创建以下菜单程序: USER ...
- linux —— shell 编程(文本处理)
导读 本文为博文 linux -- shell 编程(整体框架与基础笔记)的第4小点的拓展.(本文所有语句的测试均在 Ubuntu 16.04 LTS 上进行) 目录 基本文本处理 流编辑器sed a ...
- Shell脚本——Shell编程规范及变量
Shell编程规范及变量 一.Shell脚本概述 1.1.1 Shell基本概念 1.1.2 Shell脚本应用场景 1.1.3 Shell作用--翻译官 二.shell编程规范 2.1 用户登录sh ...
- 【“计算机科学与技术”专业小白成长系列】Linux Shell 编程 极简教程
Linux Shell 编程 极简教程 内容摘要 本文是 Linux Shell 编程简单入门.主要内容: Linux 简介 Shell 编程入门 Kotlin 脚本与 Shell 脚本 Linux ...
- 《Linux Shell编程从初学到精通(第2版)》pdf
下载地址:网盘下载 内容简介 编辑 shell是用户与内核进行交互操作的一种接口,是linux最重要的软件之一.目前最流行的shell称为bash shell,bash shell脚本编程以其简洁.高 ...
- linux简单重定向代码,Linux Shell编程(26)——代码块重定向
像 while, until, 和 for 循环代码块, 甚至 if/then 测试结构的代码块都能做到标准输入的重定向. 即使函数也可以使用这种重定向的格式 .所有的这些依靠代码块结尾的 < ...
- Linux Shell编程语句case
Linux Shell编程case语句 case语句 case语句适用于需要进行多重分支的应用情况. case分支语句的格式如下:case $变量名 in模式1)命令序列1;;模式2)命令序列2;; ...
- linux shell 处理日语,linux —— shell 编程(文本处理)
导读 本文为博文linux -- shell 编程(整体框架与基础笔记)的第4小点的拓展.(本文所有语句的测试均在 Ubuntu 16.04 LTS 上进行) 1.基本文本处理 sort:用于排序,常 ...
- linux怎么退出shell编程,Linux Shell编程(11)——退出和退出状态
exit命令一般用于结束一个脚本,就像C语言的exit一样.它也能返回一个值给父进程. 每一个命令都能返回一个退出状态(有时也看做返回状态).一个命令执行成功返回0,一个执行不成功的命令则返回一个非零 ...
最新文章
- seaborn系列 (18) | 线性回归图regplot()
- linux shell 数组倒序
- Oracle常用监控SQL
- SQL server中DateTime类型字段如何赋值零?
- 荐读|属性与可直接访问的数据成员之间应该如何选
- WebStorm安装Vim以及快捷键设置
- 数据结构--二叉树与森林记事本
- Matlab实现圆孔夫琅和费衍射
- 【考研政治】马克思主义基本原理概论——导论篇
- vmware虚拟机添加物理网卡与虚拟网卡
- 问题记录1:网络和共享中心打不开的解决办法
- 嵌入式Linux misc 设备驱动
- 美元的阿拉伯数字转换为英文大写的格式
- Python基于随机游走模型的PageRank算法及应用
- 误删c盘user文件夹后,如何恢复文件
- 读《Scratch 2.0 少儿游戏趣味编程》
- 谷歌股价跌的越多,我们买的越多
- 语音编码标准(G.711 G.723 G.726 G.729 iLBC)
- TCP拥塞控制算法BBR源码分析
- 热插拔48块硬盘服务器,中云网眼WEM-SAN100/48B48盘位网络存储设备IP-SAN
热门文章
- http://jingyan.baidu.com/article/636f38bb3eb78ad6b8461082.html
- install ipython-notebook
- 【转】【翻】Android Design Support Library 的 代码实验——几行代码,让你的 APP 变得花俏...
- s3c2440的GPIO驱动
- 中科大软件学院第一学期总结
- BZOJ3674: 可持久化并查集加强版
- 软件工程项目需求分析
- 页面性能优化的利器 — Timeline
- [高级]性能分析工具TraceView
- python基础知识2——基本的数据类型——整型,长整型,浮点型,字符串