Linux学习笔记(16)shell基础之Bash变量
1. 用户自定义变量
(1)变量设置规则
① 变量名称可由字母、数字和下划线组成,但不能以数字开头;
② 变量的默认类型为字符串类型,如果要对数值运算,则必须指定变量类型为数值型;
③ 变量用等号连接值,且等号两侧不能有空格;
④ 变量的值如果有空格,需使用单引号或双引号括起;
⑤ 变量的值中,可使用"\"转义符;
⑥ 如果需要增加变量的值,可以进行变量值的叠加,不过变量需要用双引号包含,即"$变量名",或者用${变量名}包含;
⑦ 如果是把命令的结果作为变量值赋予变量,则需要使用反引号或$()包含命令;
⑧ 环境变量名建议大写,便于区分。
(2)变量分类
① 用户自定义变量;
② 环境变量:主要保存与系统操作环境相关的数据;
③ 位置参数变量:用于向脚本当中传递参数或数据的,变量名不能自定义,变量作用是固定的;
④ 预定义变量:是Bash中已经定义好的变量,变量名不能自定义,变量的作用也是固定的。
(3)本地变量
① 变量定义:
[root@localhost ~]# name="ws" [root@localhost ~]# echo "$name" ws
② 变量叠加:
[root@localhost ~]# aa=
[root@localhost ~]# aa="$aa"
[root@localhost ~]# aa=${aa}
[root@localhost ~]# echo $aa
③ 变量查看:
[root@localhost ~]# set aa= colors=/etc/DIR_COLORS name=ws
④ 变量删除
[root@localhost ~]# unset name
2. 环境变量
1)用户自定义变量只在当前的shell中生效,而环境变量会在当前shell和该shell的所有子shell中生效。如果把环境变量写入相应的配置文件中,那么该环境变量就会在所有的shell中生效。
父shell中创建子shell,可在当前shell中通过命令bash或csh来创建。可通过pstree命令(功能:确定进程数)来查看父shell与子shell的关系。
例:
[root@localhost ~]# bash [root@localhost ~]# pstree ........ sshd───sshd───bash───bash───pstree
其中,sshd为远程连接工具,第一个bash为父shell,第二个bash是子shell,退出子shell只需输入命令exit即可。
2)设置环境变量
格式为:export 变量名=变量值
例:
#将age和sex变量设置为环境变量
[root@localhost ~]# name=ws [root@localhost ~]# export age= [root@localhost ~]# sex=male [root@localhost ~]# export sex
#然后在当前shell和子shell中进行查看
[root@localhost ~]# set name=ws age= sex=male [root@localhost ~]# bash age= sex=male
3)查询环境变量的命令为:env,删除变量的命令为:unset 变量名
4)系统常见环境变量
① PATH:系统查找命令的路径,系统命令并没有写路径就可执行,如ls,是由于PATH环境变量的作用。因此自己写的脚本拷贝到PATH指定的路径中,无需写路径即可直接执行。
例:
[root@localhost ~]# env | grep PATH PATH=/usr/lib/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin #PATH变量叠加 PATH="$PATH":/root/sh
② PS1:定义系统提示符的变量
|
提示符 |
含义 |
|
\d |
显示日期,格式为"星期 月 日" |
|
\h |
显示简写主机名 |
|
\T |
显示12小时制时间,格式为"HH:MM:SS" |
|
\A |
显示24小时制时间,格式为"HH:MM" |
|
\u |
显示当前用户名 |
|
\w |
显示当前所在路径的完整名称 |
|
\W |
显示当前所在目录的最后一个目录 |
|
\# |
执行的第几个命令 |
|
\$ |
提示符,root用户为"#",普通用户为"$" |
例:
[root@localhost ~]# PS1='[\u@\t \w]\$ ' [root@:: ~]# PS1='[\u@\h \# \W]\$ ' [root@localhost ~]# PS1='[\u@\h \W]\$ ' [root@localhost ~]#
3. 位置参数变量
1)
|
位置参数变量 |
作用 |
|
$n |
n为数字,$0代表命令本身,$1-$9代表第一至第九个参数,十以上的参数需要用大括号包含,如${10} |
|
$* |
代表命令行中所有的参数,$*把所有的参数看成一个整体 |
|
$@ |
也代表命令行中所有的参数,不过$@把每个参数区分对待 |
|
$# |
代表命令行中所有参数的个数 |
例1:写param.sh脚本
[root@localhost sh]# vim param.h #!/bin/sh echo $ echo $ echo $ echo $
验证$n,向脚本中传递参数
[root@localhost sh]# ./param.h ./param.h
例2:param1.sh脚本
[root@localhost sh]# vim param1.h #!/bin/bash num1=$ num2=$ sum=$(( $num1 + $num2 )) echo $sum
验证:
[root@localhost sh]# ./param1.sh
例3:写param3.sh
[root@localhost tmp]# vim param3.sh #!/bin/bash #使用$#代表所有参数个数 echo "A total of $# parameters" #使用$*代表所有的参数 echo "The parameter is:$*" #使用$@也代表所有参数 echo "The parameter is:$@"
验证:
[root@localhost tmp]# ./param3.sh A total of parameters The parameter is: The parameter is:
例4:$*与$@的区别
[root@localhost sh]# vim param4.sh
#!/bin/bash
# $*中所有参看成是一个整体,所以for只执行一次
for i in "$*"
do
echo "The parameter is:$i"
done
# $@中每个参数都看成是独立的,会循环多次
x=
for y in "$@"
do
echo "The parameter $x is:$y"
x=$(( $x + ))
done
验证:
[root@localhost sh]# ./param4.sh The parameter is: The parameter is: The parameter is: The parameter is: The parameter is: The parameter is:
4. 预定义变量
1)
|
预定义变量 |
作用 |
|
$? |
shell中最后一次执行命令的返回状态。如果这个变量的值为0,证明上一个命令正确执行;如果这个变量的值为非0(具体是哪个数,由命令自己来决定),则证明上一个命令执行不正确 |
|
$$ |
当前进程的进程号(PID) |
|
$! |
后台运行的最后一个进程的进程号(PID) |
逻辑"&&"和"||"可以通过$?来判断是否正确。
例:编写variable.sh脚本
[root@localhost sh]# vim variable.sh #!/bin/bash #输出当前进程PID,该PID即为variable.sh脚本执行时,生成的进程的PID echo "The current process is $$" # &可以将命令放入后台 find /root -name hello.sh & echo "The last one Daemon process is $!"
验证:
[root@localhost sh]# ./variable.sh The current process is The last one Daemon process is
2)read:接收键盘的输入,其格式为:
read [选项] [变量名]
其中,-p "提示信息":在等待read输入时,输出提示信息;
-t 秒数:read命令会一直等待用户输入,使用此选项,可指定等待时间;
-n 字符数:read命令只接受指定的字符数;
-s:隐藏输入的数据,适用于机密信息的输入。
例:
[root@localhost sh]# vim readtest.sh #!/bin/bash # 提示"请输入姓名"并等待30s,把用户的输入保存入变量 read -t -p "Please input your name:" name echo "name is $name" # 使用-s选项隐藏输入年龄 read -t -s -p "Please enter your age:" age echo -e "\n" echo "age is $age" # 使用-n 1选项只接收一个输入字符就会执行(不用输入回车) read -n -t -p "Please select your gender [M/F]:" gender echo -e "\n" echo "sex is $gender"
验证:
[root@localhost sh]# ./readtest.sh Please input your name:ws name is ws Please enter your age: age is Please select your gender [M/F]:M sex is M
5. Bash的运算符
(1)数值运算与运算符
1)declare声明变量类型,其格式为:
declare [+/-] [选项] 变量名
其中,"-"选项表示给变量设定类型属性,"+"选项表示取消变量的类型属性,-i选项表示将变量声明为整数型,-x选项表示将变量声明为环境变量,-p选项显示指定变量被声明的类型。
例1:
# 定义变量aa和bb [root@localhost ~]# aa= [root@localhost ~]# bb= # 声明变量cc,并保存aa和bb的和 [root@localhost ~]# declare -i cc="$aa"+"$bb" # 显示cc的类型 [root@localhost ~]# declare -p cc declare -i cc="" # 取消cc的类型属性 [root@localhost ~]# declare +i cc [root@localhost ~]# declare -p cc declare -- cc=""
例2:expr或let数学运算工具(使用较少)
# 给变量aa和bb赋值 [root@localhost ~]# aa= [root@localhost ~]# bb= # dd为aa和bb的和,且注意"+"左右两侧必须有空格 [root@localhost ~]# dd=$(expr "$aa" + "$bb") [root@localhost ~]# echo $dd
例3:"$(( 运算式 ))"或"$[ 运算式 ]"(使用较多)
[root@localhost ~]# aa= [root@localhost ~]# bb= [root@localhost ~]# ee=$(( $aa+$bb )) [root@localhost ~]# echo $ee [root@localhost ~]# ff=$[ $aa+$bb ] [root@localhost ~]# echo $ff
(2)运算符
|
优先级 |
运算符 |
说明 |
|
13 |
-,+ |
单目负、单目正 |
|
12 |
!,~ |
逻辑非、按位取反或补码 |
|
11 |
*,/,% |
乘、除、取模 |
|
10 |
+,- |
加、减 |
|
9 |
<<,>> |
按位左移、按位右移 |
|
8 |
<=,>=,<,> |
小于等于,大于等于,小于,大于 |
|
7 |
==,!= |
等于、不等于 |
|
6 |
& |
按位与 |
|
5 |
^ |
按位异或 |
|
4 |
| |
按位或 |
|
3 |
&& |
逻辑与 |
|
2 |
|| |
逻辑或 |
|
1 |
=,+=,-=,*=,/=,%=, &=,^=,|=,<<=,>>= |
赋值、运算且赋值 |
例:
# 虽然乘和除的优先级高于加,但通过小括号可调整运算的优先顺序 [root@localhost ~]# aa=$(( (+)*/ )) [root@localhost ~]# echo $aa # 14不能被3整除,余数是2 [root@localhost ~]# bb=$(( % )) [root@localhost ~]# echo $bb # 逻辑与运算 [root@localhost ~]# cc=$(( && )) [root@localhost ~]# echo $cc
(3)变量测试与内容替换
|
变量置换方式 |
变量y没有设置 |
变量y为空值 |
变量y设置值 |
|
x=${y-新值} |
x=新值 |
x为空 |
x=$y |
|
x=${y:-新值} |
x=新值 |
x=新值 |
x=$y |
|
x=${y+新值} |
x为空 |
x=新值 |
x=新值 |
|
x=${y:+新值} |
x为空 |
x为空 |
x=新值 |
|
x=${y=新值} |
x=新值 y=新值 |
x为空 y值不变 |
x=$y y值不变 |
|
x=${y:=新值} |
x=新值 y=新值 |
x=新值 y=新值 |
x=$y y值不变 |
|
x=${y?新值} |
新值输出到标准错误输出(即屏幕) |
x为空 |
x=$y |
|
x=${y:?新值} |
新值输出到标准错误输出 |
新值输出到标准错误输出 |
x=$y |
例:变量测试:x=${y-新值}
[root@localhost ~]# x=${y-new}
[root@localhost ~]# echo $x
new
[root@localhost ~]# y=""
[root@localhost ~]# x=${y-new}
[root@localhost ~]# echo $x
[root@localhost ~]# y=
[root@localhost ~]# x=${y-new}
[root@localhost ~]# echo $x
6. 环境变量配置文件
(1)简介
1)source命令--环境变量配置文件的内容需要重新登录才能生效,source命令的作用是让其直接生效,无需重新登录。其格式为:
source 配置文件 或 . 配置文件
注意:.与配置文件中间有空格,且.的作用即为source的作用。
2)环境变量配置文件中主要是定义对系统的操作环境生效的系统默认环境变量,如:PATH,HISTSIZE,PS1,HOSTNAME等默认环境变量。
系统中的环境变量配置文件主要有:
/etc/profile ; /etc/profile.d/*.sh ; ~/.bash_profile ; ~/.bashrc ; /etc/bashrc
(2)作用
环境变量配置文件的先后调用顺序如下图所示:

1)/etc/profile的作用有:USER变量;LOGNAME变量;MAIL变量;PATH变量;HOSTNAME变量;HISTSIZE变量;umask;调用/etc/profile.d/*.sh文件;
2)~/.bash_profile的作用: 调用了~/.bashrc文件;在PATH变量后面加入了":$HOME/bin"目录;
3)~/.bashrc的作用:定义默认别名;调用/etc/bashrc;
4)/etc/bashrc的作用:PS1变量;umask变量;PATH变量;调用/etc/profile.d/*sh文件。注意:与/etc/profile不同,/etc/bashrc针对的是没有登录的shell,即不用输入用户名、密码,直接在shell中进行用户切换的情景。
(3)其他配置文件和登录信息
1)注销时生效的环境变量配置文件:~/.bash_logout;
2)其他配置文件:~/bash_history,当系统出现错误时,一个重要的排错手段;
3)shell登陆信息:
对于本地终端欢迎信息:/etc/issue
|
转义符 |
作用 |
|
\d |
显示当前系统日期 |
|
\s |
显示操作系统名称 |
|
\l |
显示登录的终端号,比较常用 |
|
\m |
显示硬件体系结构,如i386,i686等 |
|
\n |
显示主机名 |
|
\o |
显示域名 |
|
\r |
显示内核版本 |
|
\t |
显示当前系统时间 |
|
\u |
显示当前登录用户的序列号 |
Linux本地支持6个本地字符终端,用Alt+F1~F6进行切换,则可通过\l显示当前登录的是哪个终端。
注意:/etc/issue只对本地登录有效,对远程登录没有作用。
远程终端的欢迎信息:/etc/issue.net,转义符在该文件中不能使用,是否显示此欢迎信息,是由ssh的配置文件(/etc/sshd/sshd_configure)决定的,在该文件中找到"Banner"子串,然后加入"Banner /etc/issue.net"行才能显示。写完之后记得输入service sshd restart命令进行重启ssh服务。
登陆后的欢迎信息:/etc/motd,不管是本地登录还是远程登录,都可以显示此欢迎信息。
Linux学习笔记(16)shell基础之Bash变量的更多相关文章
- #Linux学习笔记# 自定义shell终端提示符
我使用的Linux发行版是LinuxMint 17.2 Rafaela,默认情况下Terminal中的shell提示包括了用户名.主机名.当前目录(绝对路径)和提示符.这样会导致当进入一个比较深的目录 ...
- Linux学习笔记:Shell脚本学习
概念 真正能够控制计算机硬件(CPU.内存.显示器等)的只有操作系统内核(Kernel),图形界面和命令行只是架设在用户和内核之间的一座桥梁. 由于安全.复杂.繁琐等原因,用户不能直接接触内核(也没有 ...
- Linux学习笔记 -- 初识 Shell
Shell 是什么 Shell 是一个用C语言编写的程序,它是用户使用Linux的桥梁.Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务.Shell既是 ...
- Linux学习笔记(17) Shell编程之基础
1. 正则表达式 (1) 正则表达式用来在文件中匹配符合条件的字符串,正则是包含匹配.grep.awk.sed等命令可以支持正则表达式:通配符用来匹配符合条件的文件名,通配符是完全匹配.ls.find ...
- linux笔记:shell基础和bash的基本功能
shell的优势:可以直接调用linux系统命令 shell脚本的基本写法:脚本名以.sh结尾程序的第一行为#!/bin/bash,告诉系统这是一个shell脚本以#作为注释shell脚本的执行方式: ...
- Linux学习笔记<五>——<Shell部分>
管道命令(pipe) 1.把一个命令的输出作为另一个命令的输入 ls -al /etc | less 2.选取命令:cut和grep cut命令可以将一段消息的某段切出来. -d接分隔符,-f是取出第 ...
- Linux学习笔记(18) Shell编程之流程控制
1. if语句 (1) 单分支if条件语句 格式为: # 注意条件判断式两端的空格if [ 条件判断式 ];then 程序员 fi 或者 if[ 条件判断式 ] then 程序 fi 例:判断分区使用 ...
- linux学习笔记之shell
本文参考:shell脚本学习指南 本文阅读前提为:知道shell指令,但不知道如何完成一个自动化的shell脚本. 因为编辑本文时,作者也是一个新手.所以,在一些理论上,可能存在错误.如果存在错误,希 ...
- linux学习笔记:1.基础知识和命令行基本操作
初次学习linux系统,想在这里记录自己的学习痕迹,如发现有不足之处,希望能指出,谢谢啦,之后的学习是在虚拟机VMware 10下的Red Hat Enterprise linux 6 的操作. 一. ...
随机推荐
- ACM/ICPC 之 DP-浅谈“排列计数” (POJ1037)
这一题是最近在看Coursera的<算法与设计>的公开课时看到的一道较难的DP例题,之所以写下来,一方面是因为DP的状态我想了很久才想明白,所以借此记录,另一方面是看到这一题有运用到 排列 ...
- FFmpeg-20160418-snapshot-bin
ESC 退出 0 进度条开关 1 屏幕原始大小 2 屏幕1/2大小 3 屏幕1/3大小 4 屏幕1/4大小 S 下一帧 [ -2秒 ] +2秒 ; -1秒 ' +1秒 下一个帧 -> -5秒 F ...
- springmvc 文件下传、上载、预览。以二进制形式存放到数据库(转载)
springmvc 文件上传.下载.预览.以二进制形式存放到数据库.数据库中的关于传入附件的字段我写了2个:一个存放内容accessory,一个存放文件的后缀filetype 上传:首先需要2个必须的 ...
- MPAndroidChart 教程
以前没用过MPAndroidChart,为了方便学习查找,引用下别个大神的笔记. 其余文章索引: MPAndroidChart 教程:概述MPAndroidChart 教程:开始 Getting St ...
- IOS - 开发之内存缓存机制
使用缓存的目的是为了使用的应用程序能更快速的响应用户输入,是程序高效的运行.有时候我们需要将远程web服务器获取的数据缓存起来,减少对同一个url多次请求. 内存缓存我们可以使用sdk中的NSURLC ...
- 【2016-09-16】UbuntuServer14.04或更高版本安装问题记录
出于项目需要,我们的Qt程序需要运行在 1. Windows/Linux-X86平台(CPU为常见的桌面级CPU如G3220.I3等): 2. Windows/Linux-X86低功耗平台(CPU为I ...
- Orleans是什么 (一)
官网:http://dotnet.github.io/orleans/ 文档:http://dotnet.github.io/orleans/What's-new-in-Orleans 源码:http ...
- Qt中如何添加.qrc文件
You need a resource file (.qrc) within which you embed the input text file. The input file can be an ...
- 《Thinking in Java》十七章_容器深入研究_练习13(Page484)
练习13: 单词计数器 import java.io.BufferedReader; import java.io.FileInputStream; import java.io.FileNotFou ...
- 三、jQuery--jQuery基础--jQuery基础课程--第1章 初识jQuery
环境搭建 搭建一个jQuery的开发环境非常方便,可以通过下列几个步骤进行. 下载jQuery文件库 在jQuery的官方网站(http://jquery.com)中,下载最新版本的jQuery文件库 ...