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}";

 

 

 

 

 

 

 

 

 

 

posted on 2022-11-17 15:49  暮夜~  阅读(180)  评论(0编辑  收藏  举报

导航