3.1. shell中预先设置好的变量,可以直接调用,不能自定义,不能删除新建或者修改,按照位置不交互传参 16
4.1. shell中预先设置好的变量,可以直接调用,不能自定义,不能删除新建或者修改 19
5.2. 要在登录或注销时执行脚本,分别需要使用 ~.bash_profile 和 ~.bash_logout 文件 21
用户自定义变量(增删改查)
简介
也叫本地变量,只在当前的shell中生效
变量的优点:提高代码效率
在shell中调用一个未赋值的变量,不会报错,返回空值
增:
变量名称=变量值
变量命名规则
变量名是区分大小写的
变量名不可以是数字开头
但是可以包含数字、字母和下划线
例子
_num=111合法
1num=111不合法
1num%=111不合法,特殊字符只有下划线合法
变量名的规范
变量名要有意义,不要拼音和abcd,尽量用英语单词
如果变量名过长们可以采用驼峰式命名或者下划线
xiaoming_age
XiaomingAge
对于常量(例如环境变量)采用全部大写表示
不要以系统中的关键字和内置变量为为变量名
改
name=sc echo $name name=canglaoshi echo $canglaoshi 覆盖的方式修改变量
查看
set 【选项】和env和export
set
-u如果设定该选项,调用未声明变量时会报错
例题:echo $a 输出为空 a="" echo $age 输出也是空 ,怎么办,先set -u 若调用未声明变量会报错,记住顺便写入环境变量
空就是直接回车定义他什么都没有,或者""也可以,""看得更清楚点,没定义就是还没定义他是空还是什么值,set -u应该是持续监控,怕自己区分不出来就先set -u,set -u相当于持续监控,然后再echo变量,整个当前的bash环境就都可以生效了,但是切换了bash环境就还得set -u才行
-x如果设定此选项,在命令执行之前,会把命令先输出一次(没啥用吧)
只输入set 查看系统中所有的环境变量(env(enviroment)也可以查看,但是查不到自定义变量)
set和env查变量
env中变量详解
export也只能查看环境变量,导出环境变量
删除
unset 变量名
若test=123 ,unset test可以删除test变量
环境变量
用户环境变量
和用户自定义变量的区别:环境变量在子shell可以生效(任何shell环境都生效),而用户自定义变量在shell不能生效
可以知道,我们设置export环境变量是11111,但是,我们的set的意思是进入一个子shell然后设置name=1然后退出到现在的父shell,但是现在的父shellexport依然是11111
增
export 变量名=变量值
export AGE="18"(或者AGE="18" export age)
实验:name=23 新建一个bash,发现无法看到name变量 export AGE="18",可以看到AGE变量(因为set新建的是当前环境下的变量,而export 定义的是环境变量)
当打开终端时,会默认读取系统中环境变量设置的文件(/etc/profile)(当打开终端并且exoprt下写入才会生效)
查询
set和env互补查询export导出环境变量
删除
unset AGE
系统自带环境变量
类型
PATH环境变量
查找PATH系统命令的路径 echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
系统会在上述目录中直接查找命令,当你输入命令时想要不打绝对路径,你可以放到上述文件中,或者添加文件到上述目录中
实验
实验1将命令加入到上述目录中:vi hello.sh 在里面写echo "1111111" ,保存,然后cp hello.sh /bin ,直接hello.sh(可以自动补全)
实验2追加一个目录到PATH中mkdir sh vim hello.sh PATH="$PATH":/root/sh echo $PATH可以查到PATH中多了目录/root/sh
PS1环境变量
查询:echo $PS1
分别代表当前用户名 主机名 登陆目录的最后一个目录 普通用户还是超级用户
选项
H显示完整主机名
w显示完整目录
A显示时间
尝试修改:PS1='[\u@\H:\A \w]\$ '(使用单引号,不然双引号还需要转义符)
临时生效,写入到/etc/bashrc
LANG语系变量
echo $LANG 可以查看用户编码
环境变量配置文件
系统变量登陆时流程图
登录和注销
登陆时生效的环境变量配置文件
当打开终端时,会默认去读取系统中环境变量设置的文件
登陆时生效的系统配置文件(对所有用户生效)
/etc/profile(系统启动读取)作用
MAIL变量,根据登陆的用户,定义邮箱为/var/spool/mail/用户名
PATH变量:根据登录用户的UID是否为0,判断PATH变量是否包含/sbin、/usr/sbin和/usr/local/sbin这三个系统命令目录(记)
umask:定义umask默认权限,需要有用户登录过程时才会生效(记)
调用/etc/profile.d/*.sh文件,即调用所有/etc/profile.d目录下的所有以.sh结尾的文件,其中最常用的是lang.sh文件,而这个文件又会调用/etc/sysconfig/i18n文件,及默认语系配置文件
/etc/profile.d/*.sh
调用lang.sh文件,而这个文件又会调用/etc/sysconfig/i18n文件
/etc/bashrc(系统启动就会读取)
umask:针对没有登录过程的umask值,及切换终端或进入子shell时调用
登录时生效的家目录配置文件(对单个用户生效)
~/.bashrc
~/.bash_profile(用户登录后读取)
在PATH变量后面加入了":$HOME/bin"这个目录,也就是说,如果我们家目录中建立了bin目录,然后把自己的脚本放入~/bin目录,可以直接执行脚本(用自动补全直接看到)
注销时生效的环境变量配置文件
./bash_logout
其他配置文件
~/bash_history 历史命令保存文件
登录信息
/etc/issue本地终端欢迎信息
vi /etc/issue
在本地终端可以看到欢迎信息,登陆之前可以增加终端显示
/etc/issue.net远程登陆欢迎信息
在生效之前先vi /etc/ssh/sshd_config,找到Banner none取消注释,并改为Banner /etc/issue.net
/etc/motd
登陆后显示的欢迎信息和警告信息
定义Bash快捷键
stty -a查询所有快捷键
stty 关键字 快捷键
stty intr ^p(不建议改,原先的ctrl+c就很好)
位置参数变量
shell中预先设置好的变量,可以直接调用,不能自定义,不能删除新建或者修改,按照位置不交互传参
$n
未知变量,进行不交互传参,n为数字,$1-$9代表第一到第九个传递的参数 (默认最大9个),十以上的参数需要用大括号包含,如${10}
实验:
原因:只能识别$1-$9,所以$10先识别$1再把字符“0”打出来,如果非要表示$10 在脚本里写 echo ${10}表示10是一个整体
$0
代表执行脚本命令本身,保存当前脚本路径
$#
代表命令行中所有参数的个数
$*
代表返回命令行中所有参数,$*把所有参数(空格隔开的参数)看成一个整体
$@
返回命令行中所有参数,$*把每个参数(空格隔开的参数)区分对待
实验1:
vi para.sh
echo " \$* is $* "
echo " \$@ is $@"
echo " \$# is $#"
结果:
实验2:进一步区分 $* 和 $@
循环三次,依次打印第123个数
vi for.sh
结果
由此可知,在循环中$* 将变量看作一个整体,而$@是将每个参数依次输出
预定义变量
shell中预先设置好的变量,可以直接调用,不能自定义,不能删除新建或者修改
$?
保存上一条命令执行的状态码
$!
后台运行最后一个进程的PID
$$
显示当前进程的进程号(PID)
$_
保存上一条命令执行的参数(相当于ESC+".")
额外增加:
开机自启动脚本位置
/etc/rc.d/rc.local(和/etc/rc.local是同一个文件,软链) centos7记着增加执行权限
开机自动执行脚本~/bash.profile
要在登录或注销时执行脚本,分别需要使用 ~.bash_profile 和 ~.bash_logout 文件
发布者:LJH,转发请注明出处:https://www.ljh.cool/35154.html