image.png

1.用户自定义变量的规则

变量名称可以由字母,数字,下划线组成
但不能以数字开头,系统会识别不了数字开头的变量 例如 1name
等号两侧不能有空格
变量名称一般习惯为大写

1.1将命令的返回值赋给变量

把命令的结果作为变量值赋予变量,用 反引号 或者$()
1.$()形式
test=$(date)
echo $test
A=$(ls -la) 等价于反引号,赋值常用的格式还是这个 $() 形式
2.反引号形式
A=ls -la 反引号,运行里面的命令,把结果返回给变量A

1.2.定义和取消定义变量


name=qwe
name=”qwe asd” 不能有空格,如果有空格,需要用双引号带起来
A=”10 “ 定义变量
echo “A=$A”

1.2.1查看所有变量命令set

1.2.3 取消定义变量 unset +变量名

只能取消自定义的,不能取消系统的环境变量

1.3.定义静态变量

静态变量不能unset掉
readonly A=99
echo “A=$A”

1.4双引号和单引号的区别

echo “$abc” 打印的是abc 的值
echo ‘$abc’ 打印的是$abc 本身 打印的就是普通字符串
反引号就是把值赋给变量,如果一个变量的值很长,可以用``括起来<br />echoa`` 等于明确告诉linux系统,这个带反引号的是可以执行的。

echo “\$abc” 打印出来的是$abc, $的作用被\转义掉了

1.5 小括号,中括号,大括号的区别

bash有父子bash之分,在当前窗口中输入bash后,就进入到了子bash中
在小括号中的命令运行的同时会在父shell中自动开启一个子shell,结束后会自动退出子shell再返回到父shell中。

  1. [root@kylin235 goldwind]# (ls;ll)
  2. 1.sh a.out DAFront_2 EMS-back
  3. 总用量 8
  4. -rwxrwxrwx 1 root root 223 7 19 18:08 1.sh
  5. -rw-r--r-- 1 root root 0 8 3 13:15 a.out
  6. drwxr-xr-x 8 root root 4096 8 5 16:13 DAFront_2
  7. drwxr-xr-x 7 root root 303 8 4 17:12 EMS-back

子shell中的值在父shell中是不生效的

  1. [root@kylin235 goldwind]# name=qw
  2. [root@kylin235 goldwind]# (name=ac)
  3. [root@kylin235 goldwind]# (name=ac;echo $name)
  4. ac
  5. [root@kylin235 goldwind]# echo $name
  6. qw

还是尽量不要用这种用法吧。。。。
image.png
echo “\$name” =echo ‘$name’ 反斜杠的作用是把特殊符号,特殊字符的作用去掉

1.6 变量值的叠加,很少用到,但要看得懂

image.png
用${变量名}+变量名
或者 PATH=$PATH:$HOME/bin 用双引号+$变量名
两种方法都不需要加空格

1.7设置环境变量

基本语法
1) export 变量名=变量值 (功能描述:将shell变量输出为环境变量)
用export声明的环境变量就是环境变量
2) source 配置文件 (功能描述:让修改后的配置信息立即生效)
3) echo $变量名 (功能描述:查询环境变量的值)

系统环境变量可以在父子shell中生效
用户自定义环境变量只能在当前shell中生效\

1.7.1系统自带环境变量 ,

$HOME $PWD $SHELL $USER
显示当前系统中的shell所有变量
set | more
echo $PATH 系统查找命令的路径 如果把自己写的脚本放在这个路径下任意一个文件夹下,在命令行中输入脚本名就可以直接调用脚本了

新增一个环境变量的路径
PATH=”$PATH”:/root/sh

1.7.2 PS1 环境变量

echo $PS1
“ /$” 如果是root登录 就显示#号,如果是普通用户就显示$
‘PS1=xxxx ‘ 最外层是用单引号括起来的,这个要用登录机器实验看看是不是默认 单引号括起来的。

  1. [root@214 EMS]# echo $PS1
  2. [\u@\h \W]\$

1.8 LANG语系变量

echo $LANG 当前操作系统的编码

2.位置参数变量

主要用来向脚本中传递参数或者数据的,变量名不能自定义,变量作用是固定的。
不被双引号(“ “)包含时,都以”$1” “$2” … “$n” 的形式输出所有参数。
$ echo “$“ “$*” 会将所有的参数作为一个整体,以”$1 $2 … $n”的形式输出所有参数;
$@ echo “$@” “$@” 会将各个参数分开,以”$1” “$2” … “$n” 的形式输出所有参数。
$n n为数字,$0表示命令本身 $1-$9 表示第一到第九个参数,10以上的参数需要用大括号包含 ,例如${10}
$# 表示命令行中所有参数的个数

  1. # !/bin/bash
  2. #获取到各个参数
  3. echo "$0 $1 $2 ${10}"
  4. #输出参数个数
  5. echo "参数个数=$#"

image.png

3.预定义变量

系统中已经定义好的变量,变量名和作用都是固定的
基本介绍就是shell设计者事先已经定义好的变量,可以直接在shell脚本中使用
基本语法
echo +$xxx
$$ (功能描述:当前进程的进程号(PID))
$! (功能描述:后台运行的最后一个进程的进程号(FID) ),基本用不到
———————————
主要常用 $?
$? 功能描述:最后一次执行的命令的返回状态。如果这个变量的值为0,证明上一个命令正
确执行﹔如果这个变量的值为非0(具体是哪个数,由命令自己来决定〉,则证明上一个命令执行不正确了。
这个命令可以用来判断上一个命令有没有执行成功
应用实例
在一个shell脚本中简单使用一下预定义变量

4.键盘接收read命令

read(选项)(参数)
-p指定读取值时的提示符
-t 指定读取值时的等待时间(秒),如果没有在指定的等待时间内输入就不等待了
-n 接收指定的字符数就开始执行
-s 隐藏输入的数据,适用于机密信息的输入

  1. #读取控制台一个num值
  2. #!/bin/bash
  3. #把键盘输入的值赋给 NUM,把要被赋值的参数放在最后一个
  4. read -p "请输入一个num=" NUM
  5. echo "输入的值是$NUM"
  6. #间隔10秒输入一个数
  7. read -p -t 10"请输入一个num=" NUM1
  8. echo "输入的值是$NUM1"
  1. #!/bin/bash
  2. read -t 30 -p "请输入第一个数:" N1
  3. read -t 30 -p "请输入第二个数:" N2
  4. sum=$[$N1+$N2]
  5. echo "和是:"$sum

读取姓名和年龄
image.png
只有-e 才能识别隐藏内容 \n表示换行
image.png

5.declare 声明或者修改变量类型 —非常核心————————

-给变量设定类型属性

+取消变量的类型属性

shell中 变量的默认类型是字符串型,
把变量声明为整数型就可以运算
-i将变量声明为整数型 integer
declare -i c=$a+$b

-a 将变量声明为数组型

declare -x test=”123” 等于 export test=”123”
把变量声明为环境变量,和export作用一样,—-和export的区别就是 export是declare的简易写法,export声明一个环境变量,最终还是通过declare -x 把变量变成了环境变量

declare -p 会查询出很多声明的变量
declare -x 将变量声明为环境变量
declare -r 将变量声明为只读变量,一旦设置为只读变量,不能修改也不能删除,也不能通过+r取消只读属性,如果使用命令行声明的的,重启后就会消失。

6.shell数组

6. 三种加减乘除符号以及括号的使用

语法有几种形式
$((运算符)) 或者 $[运算符] 或者 expr m - n
中括号 还有判断的用途
[“$a” == “+”] 判断a的值是否等于 加号
expr 的运算符之间要有空格
expr * 表示乘法
expr / 表示除法
expr % 表示取余

  1. #!/bin/bash
  2. a=`expr 2 + 3`
  3. echo $a
  4. b1=`expr $1 + $2`
  5. b=`expr $b1 \* 4`
  6. echo "输入 2 3 两个参数,乘以4的积是"=$b
  7. d=`expr $1 + $2`
  8. echo "expr加法,输入2 3两个参数,和是" $d
  9. f=$[(2+3)*4]
  10. echo "中括号写法,积是"$f
  11. e=$(((2+3)*4))
  12. echo "小括号写法,积是"$e
  13. 输出
  14. [root@kylin236 ~ 14:44:07]# ./1.sh 2 3
  15. 5
  16. 输入 2 3 两个参数,乘以4的积是=20
  17. 20
  18. expr加法,输入2 3两个参数,和是 5
  19. 中括号写法,积是20
  20. 小括号写法,积是20

7.变量的测试和内容置换,可以用来赋值使用,但不太容易想起来怎么使用

检测 x的值,判断y有没有值。但实际上用起来是 如果y有值,则x等于多少。理解上有点相反。
大括号里的 - 是扛,不是减号。
第一行的使用方法是
如果则y不存在,那么x=新值;
如果y为空,那么x为空;
如果y是其他值,那么x就是其他值。

  1. 练习脚本1
  2. [root@kylin236 ~ 12:52:54]# vi 2.sh
  3. #!/bin/bash
  4. y=2
  5. x=${y-3}
  6. echo "当y存在,y不等于新值时,x="$x
  7. y1=3
  8. x1=${y-3}
  9. echo "当y存在,y等于新值时,x="$x1
  10. y2=""
  11. x2=${y2-3}
  12. echo "当y为空时,x也为空,x="$x2
  13. y3="abc"
  14. x3=${y3-4}
  15. echo "当y等于abc,x也为abc,x="$x3
  16. 输出:
  17. [root@kylin236 ~ 12:52:53]# ./2.sh
  18. y存在,y不等于新值时,x=2
  19. y存在,y等于新值时,x=2
  20. y为空时,x也为空,x=
  21. y等于abcx也为abcx=abc
  22. 练习脚本2
  23. y4
  24. x4=${y4-4}
  25. echo "当y等于abc,x也为abc,x="$x4
  26. 输出 y等于abcx也为abcx=x4
  27. 在脚本中无法使用没有被声明值的变量,只能在命令行中使用
  28. 证明z从来没有设置过这个值,x的值就是新值,这里就是new
  29. [root@kylin236 ~ 12:46:47]# x=${z-new}
  30. [root@kylin236 ~ 12:46:59]# echo $x
  31. new

image.png

8.注释

单行注释 #xxxx

多行注释
:<<!
asda
asda
asds
xx
!
以感叹号结尾