变量
命名规则
- 开头是字母或下划线,中间可以是字母数字和下划线
- 长度不能超过255个字符
- 有效范围内变量名不能重复
- 在bash中,变量默认类型都是字符串
分类:(默认格式都是字符串)
- 用户自定义变量。
- 环境变量:保存的是和系统环境相关的数据。名称可以自定义,作用是固定的。
- 预定义变量:系统定义好的变量,不能修改值,也不能修改其作用。(包括位置参数变量:向脚本中传递参数或数据)
用户自定义变量
变量名=变量值 (等号中间不能有空格)
- x=5 赋值变量
- echo $x 输出变量
变量叠加
- x=123
- x="$x"456 显示123456
- x=${x}789 显示123456789 2种方法选一种
变量查看
- set 查看系统中的生效的变量
- set -u 开启当变量不存在时,直接报错
- env 仅用来查看环境变量
删除变量
- unset x
环境变量(最好写成大写)
用户自定义环境变量
- export 变量名=变量值
- export 变量名
常用环境变量
- HOSTNAME 主机名
- SHELL 当前的shell
- TERM 终端环境
- HISTSIZE 历史命令条数
- SSH_CLIENT 记录的是当前连接客户端ip
- SSH_TTY ssh连接的总段pts/1
- USER 当前登录的用户
- PATH变量 系统搜索命令的路径 (echo $PATH显示该变量) 比如ls命令本应该/bin/ls才能生效,但是PATH配置了/bin,把ls命令扫描到了所有可以直接使用,不用完整路径。
- PATH="$PATH":/root 在path末尾追加新的路径(上面有提到的方法)(这个是临时生效,要永久生效必须在文件中修改)
- PS1变量:命令提示符设置 就是输入命令时左边的提示
- \d:显示日期,“星期 月 日”
- \H:显示完整主机名。“localhost.localdomain”
- \t:显示时间“HH:MMSS”
- \A:显示时间 "HH:MM"
- \u:显示当前用户名
- \w:显示当前坐在目录的完整名字
- \W:显示当前坐在目录的最后一个目录
- \$:提示符,root用户会提示"#",普通用户会提示"$"
语系变量
locale 查询当前系统语系(系统语言)
- LANG:定义系统主语系的变量
- LC_ALL:定义整体语系的变量
- locale -a 查看linux支持的语系
/etc/sysconfig/i18n 系统默认语系存放路径
位置参数变量
$n n代表数字,$0代表命令本身,$1-$9代表第1到第9个参数。10以上的参数使用大括号,${10}
$* 代表命令行中所有参数,把所有参数看成一个整体
$@ 代表命令行中所有参数,把所有参数区分对待
$# 代表命令行中所有参数的个数
求和运算 最后修改权限755 才能执行
#!/bin/bash
num1=$1
num2=$2
#获取第一个和第二个变量,相加,输出
sum=$(($num1+$num2))
echo $sum
遍历传入的变量,然后显示出来
#!/bin/bash
for i in "$*"
do
echo "show $i"
done
假如传入1,2,3,4,5。遍历5次,每次显示一个数
#!/bin/bash
for y in "$@"
do
echo "show $y"
done
预定义变量
$? 最一次执行命令的返回状态。0执行正确,非0执行失败
$$ 当前进程的进程号
$! 后台运行的最后一个进程的进程号
read 相当于java中Scanner对象,在控制台等待用户输入一个命令
-t 等待时间,超过时间直接执行。-s 隐藏输入。-n 只允许输入指定数量字符(-n 1只允许输入一个数)
#!/bin/bash
read -p "please input your name:" name
echo $name
read -p "please input your age:" -t 20 age
echo $age
read -p "please input your passwd:" -s passwd
echo $passwd
read -p "please input your sex:" -n 1 sex
echo $sex
运算符
declare 声明变量类型(-给变量设置类型,+取消变量类型属性)
-a :数组
-i :整型
-x :环境变量 export 使用的就是-x
-r :只读变量
-p :显示变量被声明的类型
declare -i cc=$aa+$bb 这里会自动把aa和bb转成整型在运算
declare -a move[2]=live
echo ${move[2]}、echo ${move[*]}
数值运算
expr或者let
一下三种加法都是一样效果
aa=11
bb=22
mm=$(($aa+$bb))
ff=$[$aa+$bb]
#加号两边必须有空格
dd=$(expr $aa + $bb)
变量测试
环境变量配置
#配置文件直接生效
source 配置文件
. 配置文件
登录时生效的环境变量
/etc/profile
/etc/profile.d/*.sh
/etc/bashrc
#下面两个只会对当前用户有效
~/.bash_profile
~/.bashrc
执行顺序
环境变量可以写在任意文件内,会一次叠加,但如果是赋值,后面会覆盖前面的
正常登录由/etc/profile开始
通过su 切换用户 由/etc/bashrc开始
umask 查看系统默认权限在/etc/profile中
文件最高权限666 创建时没有执行权限
目录最高权限777
假如umask权限0022, 就是022
文件创建默认权限644 (4读)
目录最创建权限755 (5读和执行)
退出时执行命令 ~/ .bash_logout
这里面是空的,可以写:history -c 清空历史命令(一般不用,用时安全考虑,输入了明文账号密码)
history 可以查看历史命令
~/.bash_history 历史命令文件。会在退出登录的时候,把本次登录的命令记录,写进去
/etc/issue 本地登录信息(警告信息,登录的时候胡显示出来)
/etc/issue.net 远程登录信息(警告信息)
不能使用上面的转义符,是否显示由/etc/ssh/sshd_config控制(需要加入“Banner /etc/issue.net”),
/etc/motd 本地或远程登录都会显示登录信息,不过它是登陆后显示。上面两个是登录前显示
https://www.runoob.com/linux/linux-shell-variable.html
linux 制定天数,然后打印日期
#!/bin/bash
for((i=1;i<=${1};i++));
do
DATE_TODAY=`date -d "-$i days" +"%Y-%m-%d"`
./pull_logs.sh $DATE_TODAY;
done