shell脚本基础-bash脚本编程基础及配置文件
程序语言的分类:根据运行方式;
编译运行:源代码需要有编译器编译转换为程序文件;
解释运行:源代码运行时启动解释器,由解释器边解释边运行;
根据其编程过程中功能的实现是调用库还是调用外部的程序文件:
shell脚本编程:利用系统上的命令及编程组件进行编程;
完整编程:利用库或编程组件进程编程;
根据编程语模型进行分类:
面向过程的编程语言:以指令为中心来组织代码,数据是服务于代码;
顺序执行;选择执行;循环执行;
C语言,bash;
面向对象的编程语言:以数据来中心来组织代码,围绕数据来组织指令;
类(class):实例化对象,method(方法);
代表:java,C++,Python;
shell脚本编程特性:过程式编程,解释运行,依赖与外部程序文件运行;
如何写shell脚本:
脚本文件第一行,顶格写:给出shebang(解释器路径),用于指明解释执行当前脚本的解释器程序文件;
常见解释器:(#!为shebang的固定开头格式)
#!/bin/bash;
#!/user/bin/Python;
#!/user/bin/perl;
Linux常见文本编辑器:nano;
行编辑器:sed;
全屏幕编辑器:nano、vi、vim;
shell脚本是什么:
命令的堆积;
但很多命令不具有幂等性,我们需要用程序逻辑来判断运行条件是否满足,以避免其运行中发生错误;
注意:幂等性,是分布式环境下的一个常见问题,一般是指我们在进行多次操作时,所得到的结果是一样的,即多次运算结果是一致的。
也就是说,用户对于同一操作,无论是发起一次请求还是多次请求,最终的执行结果是一致的,不会因为多次点击而产生副作用。
运行脚本:
1、赋予执行权限,并直接运行此程序文件;
chmod +x 程序文件路径;赋予权限;例如:chmod +x myfirst.sh
程序文件路径;运行程序文件;例如:./myfirst.sh或者/root/myfirst.sh
2、直接运行解释器,将脚本以命令行参数传递给解释器程序直接运行;
bash 程序文件路径;例如:bash myfirst.sh 或者 bash ./myfirst.sh
注意:脚本中的空白行会被解释器忽略掉;
脚本中,除了shebang(即#!/bin/bash),余下的所有以#号开头的行,都会被视作注释行而被忽略;
shell脚本的运行是通过运行一个子shell进程实现的;
如果需要显示空白行,在当前处录入echo,即显示为空白行;
练习:写一个脚本实现以下功能;
1、显示/etc/目录下所有以大写P或者小写p开头的文件或者目录本身;
2、显示/var/目录下所有文件或目录本身,并将显示结果中的小写字母转换为大写后显示;
3、创建临时文件/tmp/myfile.XXXX;
结果:
#!/bin/bash
echo "练习1:显示/etc/目录下以大写P及小写p开头的文件或者目录本身"
ls -d /etc/[Pp]*
echo "联系2:显示/var/目录下的所有文件及目录本身,所有小写字母以大写显示"
ls -d /var/* | tr 'a-z' 'A-Z'
echo "创建临时文件/tmp/myfile.XXXX"
mktemp /tmp/myfile.XXXX
bash的配置文件:
两类:profile类、bashrc类;
profile类:为交互式登录的shell进程提供配置;
bashrc类:为非交互式登录的shell进程提供配置;
登录类型:
交互式登录shell进程:1、直接通过某终端输入登录名、密码后登录打开的shell进程;
2、使用su命令:su - 用户名,或者 su -l 用户名执行的登录切换;
非交互式登录shell进程:1、使用su命令:su 用户名执行的登录切换;
2、在图形界面下打开的终端;
3、运行脚本
profile类:
全局配置:对所有用户都生效;文件位置:/etc/profile,/etc/profile.d/*.sh;
用户个人配置:仅对当前用户生效;文件位置:用户家目录下~/.bash_profile;
功用:1、定义环境变量;
2、运行命令或脚本;
bashrc类:
全局配置:对所有用户都生效;文件位置:/etc/bashrc;
用户个人配置:仅对当前用户生效;文件位置:用户家目录下~/.bashrc;
功用:1、定义本地变量;
2、定义命令别名;
注意:只有管理员可以修改全局配置文件;
配置文件的读取次序;
交互式登录shell进程:/etc/profile --> /etc/profile.d/* --> ~/.bashrc --> /etc/bashrc;
非交互式登录shell进程:~/.bashrc --> /etc/bashrc --> /etc/profile.d/*;
命令行中的定义的特性,例如变量和别名作用域为当前shell进程的生命周期;
配置文件中的定义的的特性,只对随后新启动的shell进程有效;
让通过的配置文件定义的特性立即生效的方式:
1、通过命令行重新定义一次;
2、让shell进程重读配置文件;
使用source命令,执行方式:~]# source 配置文件 或者 ~]# . 配置文件;(. 代表source命令)
例如:1、定义别名:打开 ~/.bashrc
编辑:alias cls='clear',保存;
重读文件生效;
2、设置用户登录欢迎语:创建 /etc/profile.d/welcome.sh(语句:nano /etc/profile.d/welcome.sh)
编辑:echo "欢迎登录系统,您的行为都将在监控之下!",保存;
用户登录时显示;
3、设置环境变量:创建 /etc/profile.d/java.sh(语句:nano /etc/profile.d/java.sh)
编辑:export JAVA_HOME=/usr,保存;
重读文件生效;
练习1:定义对所有用户都生效的别名;
创建 /etc/profile.d/aliastest.sh(语句:nano /etc/profile.d/aliastest.sh)
编辑:alias cls='clear',保存;
练习2:让用户user3登录时,欢迎登录并显示登录时间:
切换用户到user3下,打开文件 ~/.bash_profile(语句:nano ~/.bash_profile)
添加语句:
time1=$(date +"%F %T")
yonghu=$(whoami)
echo "欢迎用户${yonghu},当前登录时间:${time1}";