本文前提是已经大概掌握了Linux的一些基础命令。如果你还没有掌握Linux的一些基础命令,实例代码可能看起来有点费劲。如果想很快的了解Linux的基础知识,前面的两三篇文章足够让你在很短时间内了解Linux。博客链接请点击此~~
1.Bash变量
1.1 概念
变量是计算机内存的单元,其中存放的值可以改变。当Shell脚本需要保存一些信息时,如一个文件名或是一个数字,就把它存放在一个变量中。每个变量有一个名字 ,所以很容易引用它。使用变量可以保存有用信息,使系统获知用户相关设置,变量也可以用于保存暂时信息。
1.2 变量设置规则
- 变量名称可以由字母、数字和下划线组成 ,但是不能以数字开头。如果变量名是 “2name”则是错误的。
- 在Bash中,变量的默认类型都是字符串型 ,如果要进行数值运算,则必修指定变量类型为数值型。
- 变量用等号连接值,等号左右两侧不能有空格。
- 变量的值如果有空格,需要使用单引号或双引号包括。
- 在变量的值中,可以使用“\”转义符。
- 如果需要增加变量的值,那么可以进行变量值的叠加。不过变量需要用双引号包含 “$变量名”或用${变量名}包含。
[cfp@bogon ~]$ name=3
[cfp@bogon ~]$ echo $name
3
[cfp@bogon ~]$ name="$name"456
[cfp@bogon ~]$ echo $name
3456
- 如果是把命令的结果作为变量值赋予变量 ,则需要使用反引号或$()包含命令。
- 环境变量名建议大写,便于区分。
1.3 变量分类
- 用户自定义变量,变量名、变量值,用户都可以自定义。
- 环境变量:这种变量中主要保存的是和系统操作环境相关的数据。系统默认的环境变量只能更改变量值,不能更改变量名。但是,环境变量也允许用户自己手工添加新的环境变量,用户可以自己定义变量名、变量值。
- 位置参数变量:这种变量主要是用来向脚本当中传递参数或数据的,变量名不能自定义,变量作用是固定的。变量值可以改变,不允许添加新的位置参数变量。
- 预定义变量:是Bash中已经定义好的变量,变量名不能自定义,变量作用也是固定的。变量值可以改变,不允许添加新的预定义变量。
2.用户自定义变量
变量定义 :
[cfp@bogon ~]$ name=“Liang jie”
变量叠加(上边讲过):
[cfp@bogon ~]$ aa=123
[cfp@bogon ~]$ aa="$aa"456
[cfp@bogon ~]$ aa=${aa}789
变量调用:
[cfp@bogon ~]$ echo $name
变量查看 :
[cfp@bogon ~]$set #查看系统当中的所有变量
变量删除:
[cfp@bogon ~]$ unset name
3.环境变量
3.1 概念
用户自定义变量只在当前的Shell中生效, 而环境变量会在当前Shell和这个Shell的所有子Shell当中生效。如果把环境变量写入相应的配置文件,那么这个环境变量就会在所有的Shell中生效。 那么,如何进入子Shell呢?——直接在命令行输入你想进入的Shell的名称,csh或者bash都可以,exit可以退出当前Shell。pstree可以以树状图的方式查看进程之间的派生关系。
没有进入子Shell之前默认bash shell:
以下命令进入子Shell(子shell的子shell…):l
[cfp@bogon ~]$ sh
sh-5.0$ bash
[cfp@bogon ~]$ bash
[cfp@bogon ~]$ pstree
进入之后:
3.2 设置环境变量
(1)export 变量名=变量值(如果之前已经定义过这个变量,可以直接export 变量名)
[cfp@bogon ~]$ export name='hello world' #设置环境变量
[cfp@bogon ~]$ bash #进入子Shell
[cfp@bogon ~]$ echo $name #调用环境变量
hello world
(2)env # 查所有环境变量
(3)unset 变量名 #删除环境变量
[cfp@bogon ~]$ unset name
3.3 系统常见环境变量
常见的系统环境变量(重点讲2个):
(1)PATH:系统查找命令的路径,用 :分割的一个一个路径。在Linux中,执行文件要想运行,无论是系统执行文件还是自己写的脚本,要想运行,都需要路径。但是,有没有想过,为什么系统命令不用路径就可以执行呢?原因就是PATH环境变量。当你敲一个命令的时候,系统会自动去PATH下面的所有路径中去找,直到找到了命令就会执行。如果找不到,就会报错。如果用户自己写了一个脚本,想直接用文件名来运行这个脚本,那么就要将文件路径加到PATH搜索的路径中去。让系统能找到他
[cfp@bogon ~]$ echo $PATH #查看PATH环境变量
/home/cfp/.local/bin:/home/cfp/bin:/usr/share/Modules/bin:/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin
[cfp@bogon ~]$ chmod 755 /home/cfp/text/a.txt #给要运行文件的权限
[cfp@bogon ~]$ PATH="$PATH":/home/cfp/text #在PATH路径中添加要运行文件的路径
[cfp@bogon ~]$ echo $PATH #查看PATH环境变量
/home/cfp/.local/bin:/home/cfp/bin:/usr/share/Modules/bin:/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/home/cfp/text
[cfp@bogon ~]$ a.txt #直接输入文件名,即可运行输出hello world
hello world
(2)PS1:定义系统提示符的变量 (提示符就是这个:[cfp@bogon ~]$)
\d:显示日期,格式为“星期 月 日”
\h:显示简写主机名。如默认主机名“localhost”
\t:显示24小时制时间,格式为“HH:MM:SS”
\T:显示12小时制时间,格式为“HH:MM:SS”
\A:显示24小时制时间,格式为“HH:MM”
\u:显示当前用户名
\w:显示当前所在目录的完整名称
\W:显示当前所在目录的最后一个目录
\#:执行的第几个命令
\$:提示符。如果是root用户会显示提示符为“#”,如果是普通用户 会显示提示符为“$”
[cfp@bogon ~]$ echo $PS1
[\u@\h \W]\$
[cfp@bogon ~]$ PS1='[\u@\t \w]\$ '
[cfp@20:37:16 ~]$ cd /usr/local/src
[cfp@20:37:37 /usr/local/src]$ echo PS1
4.位置参数变量
通过人为的写参数,来将参数传递到脚本当中。
位置参数变量 | 作用 |
---|---|
$n | n为数字,$0代表命令本身,$1- 9 代 表 第 一 到 第 九 个 参 数 , 十 以 上 的 参 数 需 要 用 大 括 号 包 含 , 如 9代表第一 到第九个参数,十以上的参数需要用大括号 包含,如 9代表第一到第九个参数,十以上的参数需要用大括号包含,如{10}. |
$* | 这个变量代表命令行中所有的参数,$*把所 有的参数看成一个整体 |
$@ | 这个变量也代表命令行中所有的参数,不过 $@把每个参数区分对待 |
$# | 这个变量代表命令行中所有参数的个数 |
实例如下:
[cfp@bogon ~]$ mkdir /tmp/sh #在tmp下面建立一个目录sh
[cfp@bogon ~]$ touch /tmp/sh/canshu.sh #在sh下面建立一个文件canshu.sh
[cfp@bogon ~]$ vim /tmp/sh/canshu.sh #编辑这个文件
[cfp@bogon ~]$ cat /tmp/sh/canshu.sh #canshu.sh 文件写入的内容
#!/bin/bash
echo $0
echo $1
echo $2
echo $3
[cfp@bogon ~]$ chmod 755 /tmp/sh/canshu.sh #赋予权限
[cfp@bogon ~]$ /tmp/sh/canshu.sh #$0默认命令本身
/tmp/sh/canshu.sh
[cfp@bogon ~]$ /tmp/sh/canshu.sh 11 22 33 #将11传给$1,22传给$2,33传给$3,空格隔开
/tmp/sh/canshu.sh
11
22
33
实例二:
[cfp@bogon ~]$ vim /home/cfp/text/a.txt #写一个脚本,脚本内容如下
[cfp@bogon ~]$ cat /home/cfp/text/a.txt
#!/bin/bash
num1=$1
num2=$2
sum=$(($num1+$num2))
echo 'sum is:'$sum
[cfp@bogon ~]$ chmod 755 /home/cfp/text/a.txt #赋予权限
[cfp@bogon ~]$ /home/cfp/text/a.txt 23 34 #对$1和 $2进行赋值
sum is:57
实例三:
[cfp@bogon ~]$ cat /home/cfp/text/a.txt
#!/bin/bash
echo "A total of $# parameters" # 使用 $# 代表所有参数的个数
echo "The parameters is: $*" # 使用 $* 代表所有的参数
echo "The parameters is: $@" # 使用 $@ 代表所有的参数
[cfp@bogon ~]$ /home/cfp/text/a.txt 21 33 4 5 6 45 in out
A total of 8 parameters
The parameters is: 21 33 4 5 6 45 in out
The parameters is: 21 33 4 5 6 45 in out
5.预定义变量
5.1 预定义变量
预定义变量 | 作用 |
---|---|
$? | 最后一次执行的命令的返回状态。如果这个变量的值为0,证明上一个命令正确执行;如果这个变量的值为非0(具体是哪个数,由命令自己来决定),则证明上一个命令执行不正确了。 |
$$ | 当前进程的进程号(PID) |
$! | 后台运行的最后一个进程的进程号(PID) |
[cfp@bogon ~]$ ls
Desktop Downloads Pictures Templates Videos
Documents Music Public text
[cfp@bogon ~]$ echo $?
0 #证明上一个命令是正确的
[cfp@bogon ~]$ lss
bash: lss: command not found...
Similar command is: 'ls'
[cfp@bogon ~]$ echo $?
127 #证明上一个命令是错误的
[cfp@bogon ~]$ echo $$
2338
5.2 接收键盘输入
[cfp@bogon ~]# read [选项] [变量名]
选项:
-p “提示信息”:在等待read输入时,输出提示信息
-t 秒数: read命令会一直等待用户输入,使用 此选项可以指定等待时间
-n 字符数: read命令只接受指定的字符数,就会执行
-s: 隐藏输入的数据,适用于机密信息的输入
实例:
#!/bin/bash
# Author: Liangjie
read -t 30 -p "Please input your name: " name
# 提示“请输入姓名”并等待 30 秒,把用户的输入保存入变量 name 中
echo "Name is $name "
read -s -t 30 -p "Please enter your age: " age
# 年龄是隐私,所以我们用“ -s ”选项隐藏输入
echo -e "\n"
echo "Age is $age "
read -n 1 -t 30 -p "Please select your gender[M/F]: " gender
# 使用“ -n 1 ”选项只接收一个输入字符就会执行(都不用输入回车)
echo -e "\n"
echo "Sex is $gender"
6.总结
文章总结了一些常见的Linux中的变量。用户自定义变量、环境变量、位置参数变量、预定义变量。通过一些实例来讲解这些变量的含义,以及变量的使用与限定条件。
文章如有不当之处,还请多多指教~~