1)什么是变量?内存单元,其值可以改变
变量命名规则
1.开头为字符或下划线,名字中间中能有字母、数字和下划线组成;
2.变量的长度不超过255个字符;
3.变量名在有效的范围内必须是唯一的; //如再次定义则会替换上一个变量的值
4.在Bash中,变量的默认类型都是字符串型. //即系统把所有值都当作字符串放到变量中,不论这个“字符串”实际上是整数、浮点数等等
变量按照存储数据常用分类(其他语言):字符串型,整型,浮点型,日期型
2)变量的分类
1.用户自定义变量 :可以随意更改
2.环境变量:部分可以更改
3.位置参数变量 //实际就是预定义变量 :系统已经定义完成,不能随意更改
4.预定义变量:系统已经定义完成,不能随意更改
3)如何设置用户自定义变量
1、变量名=变量值
e.g. x=5 注意,变量名只能是字母、下划线、数字组成且不能以数字开头,=号左右不可有空格
2、“”会解析特殊符号,例如$,‘’不会解析特殊符号
3、引用变量:$变量名 例如:$x
4、所有变量默认的值都是字符串类型,不可做Math运算
5、变量叠加 e.g y="$x"123 或者 y=${x}123
6、查看变量 set 会列出系统中所有的变量,包括环境变量和自定义变量
set -u //设定当调用不存在变量时,会提示错误
7、删除变量 unset 变量名 例如:unset x
4)环境变量
1.环境变量与用户自定义变量的区别
环境变量是全局变量,用户自定义变量是局部变量。
用户自定义变量只在当前的 shell 中生效,环境变量在当前 shell 和这个 shell 的所有子 shell 中生效。
用户可以自定义环境变量,但对系统生效的环境变量名和变量作用是固定的。
2.用户自定义环境变量
$ export 变量名=变量值
或
$ 变量名=变量值
$ export 变量名
3.查看环境变量
$ set 查看所有变量
$ env 查看环境变量
4.删除环境变量
$ unset 环境名
5.常用的环境变量
HOSTNAME:主机名
SHELL:当前的 shell
TERM:终端环境
HISTSIZE:历史命令条数
SSH_CLIENT:当前操作环境是用 ssh 连接的,这里记录客户端 ip
SSH_TTY:ssh 连接的终端是 pts/1
USER:当前登录的用户
PATH:系统搜索命令的路径
要想直接通过脚本名执行自己的脚本:
(1)将脚本拷贝至 PATH 中的任意目录下(不建议这样做),例如:
$ cp hello.sh /bin/
(2)将脚本所在目录添加到 PATH 变量中,例如:
$ PATH="$PATH":/root/sh 但系统重启后失效
PS1:命令提示符设置
\d:显示日期,格式为"星期 月 日"
\H:显示完整的主机名
\t:显示 24 小时制时间,格式为"HH:MM:SS"
\A:显示 24 小时制时间,格式为"HH:MM"
\u:显示当前用户名
\w:显示当前所在目录的完整名称
\W:显示当前所在目录的最后一个目录
\$:提示符。root 用户为"#",普通用户为"$"
5)语系变量
就是当前支持的语言
当前语系查询:locale //直接生效的是LANG变量(默认语系) LC_ALL:定义整体语系(不常用)
echo $LANG //当前语系环境
echo $LC_ALL //整体语系环境
locale -a | more 查看Linux支持的所有语系环境
cat /etc/sysconfig/i18n //下次开机以后的系统环境
LANG=zh_CN.UTF-8 //切换成中文
6)位置参数变量
1.位置参数变量
n:n为数字,
0 代表命令本身,
1−
9 代表第一到第九个参数,十以上的参数需要用大括号包含,如
10。
*:这个变量代表命令行中所有的参数,
∗把所有的参数看成一个整体。
@:这个变量也代表命令行中所有的参数,不过
@把每个参数区分对待。
#:这个变量代表命令行中所有参数的个数。
2.例子1:
#!/bin/bash
num1=$1
num2=$2
sum=$(($num1+$num2))
#变量 sum 的和是 num1 加 num2
echo $sum
#打印变量 sum 的值
3.例子2
#!/bin/bash
echo "A total of $# parameters"
使用 $# 代表所有参数的个数
echo "The parameters is:$*"
使用 $* 代表所有的参数
echo "The parameters is:$@"
使用 $@ 代表所有的参数
4.例子3:$* 与 $@ 的区别
#!/bin/bash
for i in "$*"
# $* 中所有参数看成是一个整体,所以这个 for 循环只会循环一次
do
echo "The parameters is:$i"
done
for y in "$@"
# $@ 中每个参数都看成是独立的,所以 $@ 中有几个参数,就会循环几次
do
echo "Parameter:$y"
done
7)预定义变量
程序执行的返回值:
$? :最后一次执行命令的返回状态,如果正确执行,则返回0;
如果返回为非零(具体数值由命令决定),则上一条命令执行不正确
执行完一条命令之后,立马敲入echo $?,可得到返回值。例如:ls 执行之后,再敲入echo $?,可以得到0
前门说到的逻辑或:|| -->ls || echo yes ;前面一条语句正确执行,才执行后一条语句。这里就是通过执行命令的返回值来判断的
逻辑与:&& --> ls qwe && echo no 也是同样的道理
$$:返回当前进程的PID号;
$!:返回后台的进程PID号;
可以通过一个简单的shell来展示一下:
sl.sh
#!/bin/bash
ehco "dang qian de PID: $$"
find / hello.sh &
echo "hou tai de PID: $!"
chmod 755 sl.sh,然后再执行:./sl.sh;可以得到当前的测试的结果
read -n
read -p “please input name ” name #-p表示输出提示信息 read [选项] 变量名
read -t 30 #-t 表示等待时间单位为秒 -t 30 表示30秒,若30秒后没有输入数据终止执行脚本
read -s #隐藏信息
echo -e “\n” 换行符
read.sh:
#!/bin/bash
read -p "please input your name:" -t 30 name
#等下输入,如果超过30秒不输入,就终止当前命令
echo $name
read -p "please input your password:" -s pwd
#输入的值是隐藏的,看不见的,但是在sh里面还是可以获取到的,并且输出的
echo -e "/n"
echo $pwd
read -p "please input your sex [M/F]:" -n 1 sex
#意思就是只能输入一个字符,且输入之后立马执行
echo -e "/n"
echo $sex
chmod 755 read.sh---> ./read.sh