shell脚本【永久设置环境变量】【设置shell登录提示】【shell运算符】

shell脚本【永久设置环境变量】【设置shell登录提示】【shell运算符】 把多个命令写入一个文件让系统自动按顺序执行就组成了Shell脚本。顺序:如果没有指定顺序的话那么就是 从上到下从左到右Shell脚本是批量命令的集合让系统自动完成重复任务。类似Windows的.bat批处理文件但更强大。注意:只要是用bash脚本解析的脚步的第一行必须写#!/bin/bash脚本文件名一般以.sh结尾运行test脚本bash test.sh脚本写完需要为其增加一个执行权限chmod x test.sh来看一个简单的脚本1.#!/bin/bash脚本声明指定用 bash 解释器运行这个脚本之前讲过的Shebang 头。2.cd /var/log切换工作目录到 Linux 系统日志默认目录/var/log后面操作messages日志文件就在这个文件夹里。3.cat /dev/null messages/dev/null是空黑洞cat读取空内容覆盖重定向用空白内容全覆盖messages清空整个日志原有内容4.echo log cleaned up. messages是追加重定向不覆盖原有内容在已经清空的messages文件末尾写入一行记录log cleaned up.最终效果日志全部清空只留下这条【日志已清理】的备注记录。整体脚本功能进入系统日志目录 → 清空 messages 系统日志 → 在日志里留下一条清理标记方便后续查看什么时候清过日志变量变量的命名规则1、变量名称只能由字母、数字或下划线组成2、不能以数字开头3、严格区分大小写4、不能使用Shell中保留的关键字 test、if、for赋值符左右不能有空格# 示例 nameShell教程 # 字符串赋值 count10 # 整型赋值 PI3.1415926 # 浮点型赋值 is_validtrue # 布尔型赋值$ 的作用告诉系统后面不是普通文字是变量名字要拿它存的值${name} 花括号用法namewang echo ${name}123 # 输出 wang123 echo $name123 # 系统当成新变量name123输出空环境变量和普通变量普通变量局部变量定义方式变量名值不加 export作用范围只在当前 Shell 生效子进程不能用特点只在本进程内有效环境变量(全局变量)可以在创建它们的Shell及其派生出来的任意子进程Shell中使用export导出为环境全局变量变量会传给后续新开的子 Shell 进程大写变量全局环境变量规范常用大写① 系统全局性环境变量对所有进程有效任何程序如编辑器、Shell 脚本等都可以使用这些变量② 临时与永久在命令行中定义的环境变量只在当前会话中有效一旦退出变量就会消失有一些环境变量比如 HOME用户家目录、 PATH命令搜索路径、 SHELLShell 类型、 USER用户名、 PWD当前工作目录 等这些变量在用户登录时由系统自动设置。实操看一下环境变量和普通变量在子shell里的效果临时echo $$查看当前 Shell 的 PID进程号我们bash打开一个子shall进程echo $$可以看到PID 改变代表已经切换成子 Shell可以看到环境变量被子进程继承正常取值普通变量没有传递给子shell取值为空永久设置环境变量永久设置如果希望变量在每次登录时都有效需要将其添加到配置文件中用户级别~/.bash_profile 或 ~/.bashrc系统级别/etc/profile 或 /etc/bashrc最后设置完了要source一下source ~/.bash_profile source ~/.bashrc source /etc/profile source /etc/bashrc我们写一个系统级别的试一下vim /etc/bashrc我们写一个系统级别的试一下vim ~/.bash_profile后加载的.bash_profile里name456覆盖了前面/etc/bashrc的name123系统写死加载流程永远是先读/etc/profile→ 连锁加载/etc/bashrc系统全局文件执行NAME123此时NAME123后读~/.bash_profile→ 内部自动调用~/.bashrc所以用户目录NAME456 永远后执行 → 覆盖系统的123最终NAME456环境变量的顺序执行顺序配置文件路径生效范围核心作用内部自动执行的动作1/etc/profile全系统所有用户系统级全局登录配置所有用户登录必执行设置全系统通用环境变量、登录初始化命令/etc/profile.d/目录下所有.sh脚本按文件名顺序挨个执行2~/.bash_profile当前用户家目录当前用户单个用户的个人登录配置仅当前用户登录时执行设置用户专属环境变量、登录初始化命令系统默认自带代码如果~/.bashrc文件存在自动执行source ~/.bashrc3~/.bashrc当前用户家目录当前用户单个用户的个人非登录配置设置用户专属的 Shell 属性、别名、函数系统默认自带代码自动执行source /etc/bashrc4/etc/bashrc全系统所有用户系统级全局非登录配置设置全系统统一的 Shell 默认属性、全局变量、函数无我们在系统级别的环境变量里添加了一个永久的环境变量时/etc/bashrc里添加了echo 你好天才切换到别的用户会看到两次输出就是因为我们环境变量的执行顺序再上表中第一次执行时里面的配置规则让我们执行了一次我们输入的内容第四次执行时执行了我们输入内容的本身所以看到两次非登录式 Shell 不会执行/etc/profile、~/.bash_profile也就是表中的最后两个显示环境变量echo $HOME # 用户的家目录 echo $UID # 当前用户的UID相当于id –u echo $PWD # 当前工作目录的绝对路径名 echo $SHELL # 当前SHELL echo $USER # 当前用户printf $HOME # printf是一个格式化打印输出工具显示默认环境变量envset可以显示系统环境变量和局部变量set取消环境变量unsetunset 只能删当前 shell 内存里的变量不能直接删掉配置文件里的代码unset name #清空内存变量 source /etc/bashrc #重新加载系统配置NAME变回123 echo $name新开登录 shell又会先 123 再被 456 覆盖设置shell的登陆提示1在/etc/motd里增加提示的字符串2是在/etc/profile.d/下面增加如下脚本echo bibilabu单引号与双引号的区别把命令执行结果赋值给变量变量命令变量$(命令)Shell中特殊且重要的内置变量变量含义$0当前脚本的文件名。$nn≥1传递给脚本或函数的参数。n 是一个数字表示第几个参数。例如第一个参数是 $1第二个参数是 $2。$#传递给脚本或函数的参数个数。$*传递给脚本或函数的所有参数参数是一个整体每一个变量参数之间以空格隔开。$传递给脚本或函数的所有参数。参数是独立的也是全部输出$?上个命令的退出状态或函数的返回值$$当前 Shell 进程 ID。对于 Shell 脚本就是这些脚本所在的进程 ID。看一下$nn≥1的效果bash 脚本 文件后面跟着的数字/文字 按顺序赋值给$1 $2 $3 $4...想要做数值加法echo $(( $1$2 ))执行后输出13$?输出0表示上条命令执行成功$*和$$*是把所有参数当做一个整体参数之间空格隔开$虽然也可以接收所有参数但是其每个参数保存时依然是独立的for 变量 in 一堆内容do每次循环把【一堆内容里的一项】放进变量执行命令donei 容器轮流装每一个参数随便叫什么都行这是自定义的一个临时变量for i in $*把所有参数打包成【1 个完整字符串】只循环 1 次for i in $保留原有参数分界每个参数独立原样分开循环Shell运算符 加 - 减 * 乘 / 除 % 求余数 与 -- 运算符就是在变量本身1--就是在变量本身-1单纯使用时放在前面或者后面没有区别echo 变量名 或者 变量名-- echo 变量名 或者 --变量名参与运算-*/%--放前面还是后面就有了区别x10 let yx 先加1再运算x10 let yx 先运算再1