目录
保存将来会变化的数据,即使数据变化,直接调用变量即可,各种 Shell 环境中都使用到了“变量”的概念。Shell 变量用来存放系统和用户需要使用的特定参数(值),而且这些参数可以根据用户的设定或系统环境的变化而相应变化。通过使用变量,Shell 程序能够提供更加灵活的功能,适应性更强。
用来存放系统和用户需要使用的特定参数(值)
变量名:使用固定的名称,由系统预设或用户定义
变量值:能够根据用户设置、系统环境的变化而变化
自定义变量:由用户自己定义、修改和使用
特殊变量:环境变量,只读变量,位置变量,预定义变量
环境变量:由系统维护,用于设置工作环境
只读变量:只可以读取不可以更改
位置变量:通过命令行给脚本传递参数
预定义变量:Bash中内置的一类变量,不能修改??? 有些规定好的变量 放在那里让你使用?
区分大小写
不能使程序中的保留字和内置变量:如:if, for,hostname 命令 a=
只能使用数字、字母及下划线,且不能以数字开头,注意:不支持短横线 “ - ”,和主机名相反
不要使用内置的变量,使用英文尽量使用词义通俗易懂,PATH
大驼峰 StudentFirstName
小驼峰 studentFirstName
下划线 student_name
name='value'
变量名=变量值
直接字串:name='root'
变量引用:name="$USER"
命令引用:name=`COMMAND` 或者 name=$(COMMAND)
注意:变量赋值是临时生效,当退出终端后,变量会自动删除,无法持久保存,脚本中的变量会随着脚本结束,也会自动删除
变量引用:
$name
${name}
{}
弱引用和强引用
"$name " 弱引用,其中的变量引用会被替换为变量值
'$name' 强引用,其中的变量引用不会被替换为变量值,而保持原字符串
变量名以字母或下划线开头,区分大小写,建议全大写
变量名=变量值
echo $变量名
??使用大括号{}定义变量的范围,将变量名分隔出来
删除变量unset
?定义变量时中间有特殊字符
?单引号与$()
格式:read 变量名
?
[root@localhost ~]# vim score.sh
--------------------------------------------------
#!/bin/bash
#输出成绩脚本
echo -n "请输入你的成绩:"
read score
echo $score
[root@localhost ~]# bash score.sh
请输入你的成绩:99
99
?
expr只能进行整数的运算
格式: expr 变量1 运算符 变量2 [运算符 变量3]
运算符:
加法 +
减法 -
乘法 \ *
除法 /
取余 (取模)%
(1) let var=算术表达式
let sum=1+2
sum=1+2
(2) $((var=算术表达式)) 和上面等价
((sum=1+2))
echo $sum
(3) var= $[算术表达式]
(4) var=$(expr arg1 arg2 arg3 ...)
(5) var= `expr arg1 arg2 arg3 ...`
(6) echo '算术表达式' | bc
echo "浮点运算字符串" | bc
echo "scale=小数位数;浮点运算字符串" | bc
?
?提取电脑系统信息脚本
提取系统信息
#!/bin/bash
RED="\E[1;31m"
GREEN="\E[1;32m"
END="\E[0m"
echo -e ?"$GREEN----------------------Host systeminfo--------------------$END"
echo -e ?"HOSTNAME: ? ? $RED`hostname`$END"
echo -e ?"IPADDR: ? ? ? $RED` ifconfig ens33|grep -Eo '([0-9]{1,3}\.){3}[0-9]
{1,3}' |head -n1`$END"
echo -e ?"OSVERSION: ? ?$RED`cat /etc/redhat-release`$END"
echo -e ?"KERNEL: ? ? ? $RED`uname -r`$END"
echo -e ?"CPU: ? ? ? ? $RED`lscpu|grep '型号名称:'|tr -s ' '|cut -d : -f2`$END"
echo -e ?"MEMORY: ? ? ? $RED`free -h|grep Mem|tr -s ' ' : |cut -d : -f2`$END"
echo -e ?"DISK: ? ? ? ? $RED`lsblk |grep '^sd' |tr -s ' ' |cut -d " " -f4`$END"
echo -e ?"$GREEN---------------------------------------------------------$END"
~
?
由系统提前创建,用来设置用户的工作环境
可以使用env查看环境变量
需要记住的常用环境变量
[root@localhost ftp]#env
#可以看到所有
?$USER 表示用户名称
$HOME 表示用户的宿主目录
$LANG 表示语言和字符集
$PWD 表示当前所在工作目录
$PATH 表示可执行用户程序的默认路径
#声明并赋值
export name=VALUE
declare -x name=VALUE
#或者分两步实现
name=VALUE
export name
?
?
系统可以通过$PATH 来执行文件 PATH=$PATH:/root/
[root@localhost opt]# PATH=$PATH:/root/
[root@localhost opt]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/root/
?
可以使子进程(包括孙子进程)继承父进程的变量,但是无法让父进程使用子进程的变量
一旦子进程修改从父进程继承的变量,将会新的值传递给孙子进程
一般只在系统配置文件中使用,在脚本中较少使用
四个系统级的环境配置变量/etc/profile ?/etc/bashrc 或者(自己家目录中的)/root/.bash_profile/ root/.bashrc .bash_profile ?/root/.bashrc
/etc/profile?
系统每次启动都会自动执行 /etc/profile 文件里的命令,这个文件是对全局有效的(所有的shell环境和用户)
~/.bash_profile ~/.bashrc
不同用户登录系统 会自动执行 自己家目录中的 ~/.bash_profile 文件中的命令,自动执行 ~/.bashrc ~/.bashrc 当前用户每切换一个shell环境都会自动执行
/etc/bashrc
/etc/bashrc 针对所有用户的,用户每切换一个shell环境都会自动执行
[root@localhost ~]# vim /etc/profile
.....................省略到行末添加
export PATH=$PATH:/root
source立即生效或 .
[root@localhost opt]# source /etc/profile
修改系统默认的命令数
[root@localhost opt]# echo $HISTSIZE
1000
[root@localhost opt]# vim /root/.bash_profile
export HISTSIZE=200
[root@localhost opt]# source /root/.bash_profile
[root@localhost opt]# echo $HISTSIZE
200
?
变量值不允许修改(重新赋值)的情况
无法使用 unset删除
最快方法重启
[root@localhost opt]# name=ky15
[root@localhost opt]# readonly name
[root@localhost opt]# echo $name
ky15
[root@localhost opt]# unset name
bash: unset: name: 无法反设定: 只读 variable
#只有退出进程
[root@localhost opt]# echo $name
ky15
[root@localhost opt]# name=ky
bash: name: 只读变量
位置变量也称为位置参数,使用$1、$2、$3、…、$9 表示
[root@test1 ~]# vim 1.sh
#!/bin/bash
echo "$1" 位置1
echo "$2" 位置2
echo "${10}" 位置10
echo "$10" 位置1和0
echo "$*" 将所有项当成一个值
echo "$@" 所有项
echo "$0" 脚本自身
echo "$#" 后面参数的个数
[root@test1 ~]# ./1.sh {1..10}
1
2
10
10
1 2 3 4 5 6 7 8 9 10
?
?
bash 帮你定义好了 拿来用就可以了,你不需要知道为什么,记住
$*:表示所有位置参数的内容看成一个整体返回 返回所有
$@:表示所有位置参数的内容分割成n份,每份作为一个独立的个体返回 返回所有
$?:表示前一条命令执行后的返回状态,返回值为 0 表示执行正确,返回任何非 0值均表示执行出现异常
$#:表示命令行中位置参数的总个数
$0:表示当前执行的脚本或程序的名称 当前脚本的名字
$$:当前bash的进程id
$!: 后台任务最后一个id
[root@localhost data]#bash test.sh {a..z}
a b c d e f g h i j k l m n o p q r s t u v w x y z
a b c d e f g h i j k l m n o p q r s t u v w x y z
[root@localhost data]#bash 1.sh {a..z}
at的结果是
a
[root@localhost data]#bash 2.sh {a..z}
星的结果是
a b c d e f g h i j k l m n o p q r s t u v w x y z
[root@localhost data]#cat 3.sh
#!/bin/bash
echo $1
定义调用 变量
运算
read -p
预定义 $@ $* $# $0 $? $$
``
''
""
{}
$()
?