变量可以解释为可以变的量。
在计算机中,变量就是计算机中的内存单元,其中存放的值可以改变。
当shell脚本需要保存一些信息时,如一个文件名或是一个数字,就把他存放在一个变量中。
每个变量可以保存有用信息,使系统获知用户相关设置,变量也可以用于保存暂时信息。
变量名称可以由字母、数字和下划线组成,但是不能以数字开头。
在bash中变量的默认类型都是字符串型,如果要进行数值运算,则必须指定变量类型为数值型。
如果变量的值有空格,用单引号或双引号包括。
如果需要增加变量的值,可以进行变量值的叠加。不过变量要用双引号包含“$变两名”或用${变量名}包含。
如果将命令的结果作为变量值赋予变量,则需要用反引号或$( )包含命令。
环境变量的名称建议大写,便于区分。环境变量所有的shell都可以使用,命令也是所有的shell都可以使用,所以为了区分环境变量与命令,使用大写。
用户自定义变量:
环境变量:
位置参数变量:
预定义变量:
定义一个变量:
变量名=“变量 值”
用户自定义的变量只对这个用户起作用,你可以
有空格用单双引号包含起来。
set # 查看系统当中所有的变量
包括环境变量,系统变量,还有自定义的一些变量。
unset name
用户自定义的变量只对这个用户起作用,你可以将这个变量写入用户级环境变量文件中:
总结:用户级变量是对这个用户的所有环境而言,而一旦切换用户,别的用户环境中时没有任何有关此变量的信息的。
这种变量中主要保存的是和系统操作环境相关的数据。
有一部分和系统操作相关的变量他的名字是事先规定好了,我们能做的就是查查有什么,最多改变他的值。
你可以自己定义新的环境变量和环境变量值。
自定义变量只在当前的shell中生效
环境变量会在当前shell和这个shell的所有子shell当中生效。
如果把环境变量写入相应的配置文件中,那么这个环境变量就会在所有的shell中生效。
设定一个环境变量的值:
export 变量名=变量值 # 申明变量
export就是把这个变量申明为全局变量,让所有的shell当中都可以查看到这个变量。
如何生成一个子shell:
而且定义一个环境变量所有的用户都可以看到并使用:
之前我们使用set
查询变量,set是可以查看到所有的变量,但是他太多了,我们还是使用专门查看环境变量:
env
unset 变量名
PATH:是系统查找命令的路径。
大部分的系统命令都是2进制的可执行文件,他不需要绝对路径就可执行,就是因为PATH环境变量。
输入一个命令,系统在上述路径中寻找,没有找到就报错。
我们不推荐改变系统的原有结构,我们更习惯的是用变量垒加,把自己的命令加进去:
PATH="$PATH":/root/sh
PS1:定义系统提示符的变量。
[root@study sh]#
我们看看可以修改那些选项:
\d | 显示日期,格式为“星期 月 日” |
---|---|
\h | 显示简写主机名,如默认主机名“localhost” |
\t | 显示24小时制时间,格式为“HH:MM:SS” |
\T | 显示12小时制时间,格式为“HH:MM:SS” |
\A | 显示24小时制时间,格式为“HH:MM” |
\u | 显示当前用户名 |
\w | 显示当前所在目录的最后一个目录 |
\W | 显示当前所在目录的完整名称 |
\# | 执行的第几个命令 |
\$ | 提示符,如果是root会提示“#”,如果是普通用户会提示“$” |
我们做以下测试:
PS1='[设定@设定@设定 设定]$ ' # 设定最后不要忘记加一个空格
位置参数变量是固定的,变量名称也是固定的,在linux中有以下位置参数变量:
位置参数变量 | 作用 |
---|---|
$0 | n为数字,$0代表你执行的命令本身,$1-$9代表第一个到第九个参数,十个以上的参数要用大括号包含,${10} |
$* | 这个变量代表命令行中的所有的参数,$*把所有的参数看成一个整体 |
$@ | 这个变量也代表命令行中的所有的参数,$@把每个参数看成一个整体 |
$# | 这个变量代表命令行中的所有参数的个数 |
其实位置参数变量对我们来说,只有脚本的建立者知道,在后面要跟几个参数,否则位置参数变量其实是不好用的。
建议用其他方式来接收脚本后的参数。
$n主要是为了接收用户向程序中传递的值。测试如下:
这就是位置参数变量的作用。通过人为的写入参数,向脚本中传递需要的数值。
写一个数值加法器:
#!/bin/bash
num1=$1
num2=$2
sum=$(($num1+$num2)) # 变量sum的值是num1+num2
echo $sum # 打印变量sum的值
这个脚本只有脚本的编写者才知道要跟两个数字,如果没有输入数值就要报错。
三者的区别是:
我们用一个例子来反映这几个变量的区别:
#!/bin/bash
echo "A total of $# parameters" # 所有参数个数
echo "The parameters is : $*" # 代表所有参数
echo "The parameters is : $@" # 代表所有参数
这个测试还不能看到$*与$@
的区别,我们使用以下脚本进行区别:
#!/bin/bash
for i in "$*" # $*中的所有参数看成是一个整体,所以这个for循环只会循环一次
do
echo "The parameters is : $i"
done
x=1
for y in "$@" # $@ 中的每个参数都看成是独立的,所以“$@”中有几个参数,就会循环几次
do
echo "The parameter$x is : $y"
x=$(($x+1)) # 每循环一次x加1
done
位置参数变量就是预定义变量中的一种,只是他的内容比较多有四个,所以单独拿出来。但是他其实和预定义变量是一样的。
预定义变量 | 作用 |
---|---|
$? | 判断上一个命令的返回状态。如果$?的值是0,证明上一个命令正确执行;非0(具体哪个数,由命令自己来决定),代表上一个命令执行不正确 |
$$ | 当前进程的进程号(PID) |
$! | 后台运行的最后一个进程的进程号 |
判断命令是否正确执行的一个变量。
这里返回的127是系统规定,当输入命令找不到,就返回127。
之前我们使用的&& ||
是如何判断前一条命令是否正确执行的,就是靠$?
来判断的。
他们都是用来查看进程的PID的:
通过一个脚本进行测试:
#!/bin/bash
echo "The current process is $$" # 查看当前的PID,就是这个脚本的PID
find /root -name hello.sh & # &用来打入后台
echo "The last one Daemon process is $!" # 输出后台最后的PID,就是find命令的PID
之前的位置参数变量接收参数时,发现必须要编写脚本的人才知道,脚本后面要跟几个参数,才能正确执行脚本。所以我们再次换为使用read来改变这种接收方式。
read [选项] [变量名]
选项:
-p:“提示信息”,在等待read输入时,输出提示信息
-t:read会一直等待用户,指定此选项可以设定等待时间
-n:read只接受指定的字符数,就会执行(不用回车)
-s:隐藏输入的数据,适用于机密信息的输入
我们使用一个脚本来解释测试这个命令:
#!/bin/bash
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 # 输入不回显,输入值给age
echo -e "\n"
echo "Age is $age"
read -n 1 -t 30 -p "Please select your gender[M/F]:" gender
# 只能输入一个字符,输入值给gender
echo -e "\n"
echo "Sex is $gender"