bash配置与shell脚本编程

写在前面:

博客书写牢记5W1H法则:What,Why,When,Where,Who,How。



本篇主要内容:

● bash特征之多命令执行

● 逻辑运算(与或非)

● 编程语言简介

● shell脚本格式与特点

● bash配置,定制bash工作特征

● 扩展

intall

mktemp

本篇涉及配置文件:

◎ /etc/profile

◎ /etc/profile.d/*.sh

◎ /etc/bashrc

◎ ~/.bash_profile

◎ ~/.bashrc

◎ ~/.bash_logout




bash特征之多命令执行:

bash支持多命令执行,不但能够按顺序执行,还可以根据命令退出码进行逻辑运算,来有选择的执行。linux命令退出码:0表示执行成功;1-255表示执行失败。

顺序执行多命令:

COMMAND1 `COMMAND2`

#命令引用方式执行多条命令

COMMAND1 | COMMAND2 | COMMAND3 | ...

#使用管道执行多命令

COMMAND1;COMMAND2;COMMAND3;...

#使用“;”逐条顺序执行多条命令。前面命令错误与否不影响后面命令执行

逻辑组合(与或非):

COMMAND1 && COMMAND2 && ...

COMMAND1 || COMMAND2 || ...

! COMMAND1

逻辑运算:

与:

符号:&&

命令列表都为true(即都正确执行),则返回true;否则返回false;

短路执行:其中一个为false,则后面不再继续执行,结果为false;

或:

符号:||

命令列表都为false(即执行错误),则返回false;否则返回true;

短路执行:其中一个为true,则后面不再继续执行,结果为true;

非:

符号:!

! true = false

! false = true

与数学运算中的加减乘除类似,逻辑运算也有优先级:! > && > ||

shell脚本编程:

编程语言简介:

(1)编程语言根据运行过程分类:

编译运行类:

源代码 --> 编译器(编译)--> 汇编器(汇编)--> 链接器(链接)-->可执行文件

解释运行类:

源代码 -->解释器(解释)--> 运行

(2)编程语言根据编程过程中功能的实现方式分类:

shell脚本编辑:

命令解释器:基于shell进程去运行内部或外部命令程序;

编程接口:提供对过程式编程逻辑的支持,实现编程机制;

完整编程语言:

利用库或编程组件进行编程;

(3)根据编程范式分类:

过程式编程语言

以指令为中心,围绕指令设计数据;

对象式编程语言(OOP)

以数据为中心,围绕数据组织指令;

过程式编程语言代码执行顺序有三种:

顺序执行

选择执行

循环执行

根据上面简介,shell脚本是解释运行、过程式编程语言,其运行以来与外部命令程序。

shell脚本格式:

1、脚本文本第一行。

顶格给出shebang:解释器程序文件的路径,用来致命解释运行当前脚本代码的解释器。如:

#!/bin/bash

#!/bin/tcsh

#!/usr/bin/python3

#!/usr/bin/perl

2、#开头的行为注释部分,会被编译器忽略;

3、空白行会被编译器忽略;

shell脚本编辑器:

普通的文本编辑器即可完成对shell脚本的编写。如vi,vim,nano等。

shell脚本特点:

a.可以进行命令罗列编写简单脚本

b.许多命令不具有幂等性,需要用程序逻辑来判断运行条件是否满足。

幂等性:即多次执行的影响与一次执行的影响相同。

shell脚本运行方法:

linux文件权限管理策略决定,要想将文件加载为进程,发起人必须有对此文件的x权限,所以,shell脚本运行前必须赋予x权限或指定编译器:

a.赋予执行权限,直接运行:

chmod +x SCRIPT_FILE

./SCRIPT_FILE

b.直接运行编译器,将脚本文件作为参数:

bash SCRIPT_FILE

练习:

编写shell脚本实现以下功能:

用户storm不存在时,添加此用户,添加完成后,提示添加完成;否则显示该用户已经存在。

答案:

[[email protected] shell]# cat useradd_storm.sh 
#!/bin/bash
# if user storm excise,show "user storm excise".alse,add user storm,show "added user storm "
# by Fred

USERNAME=storm
id $USERNAME &> /dev/null && echo "user $USERNAME excise" || (useradd $USERNAME && echo "added user $USERNAME")
[[email protected] shell]# ./useradd_storm.sh 
added user storm
[[email protected] shell]# ./useradd_storm.sh 
user storm excise

bash配置,定制bash工作特征:

配置文件分类:

(1)profile类:

为交互式登录shell进程实现初始化配置文件;

定义环境变量;

运行命令或脚本;

(2)bashrc类:

为交互式登录shell进程实现启动配置的配置文件;

定义命令别名;

定义umask;

(3)logout类:

为交互式登录shell进程提供终止清理功能的配置文件;

根据配置文件的作用范围分类:

(1)对全局所有用户生效:(管理员有权限修改)

/etc/profile,/etc/profile.d/*.sh

/etc/bashrc

(2)仅对单个用户有效:

~/.bash_profile

~/.bashrc

shell进程的启动方式分类:

用户登录式:

通过终端登录用户启动的shell进程;

使用su - USERNAME实现的用户切换;

非登录式:

su USERNAME实现的用户切换;

图形界面打开的命令行接口;

运行脚本;

不同shell进程启动方式,配置文件的读取数量、顺序不尽相同:

用户登录式:

/etc/profile --> /etc/profile.d/*.sh --> ~/.bash_profile --> ~/.bashrc --> /etc/bashrc

非登录式:

~/.bashrc --> /etc/bashrc --> /etc/profile.d/*.sh

修改配置文件后,新定义配置生效方式:

(1)重新登录shell进程:

登出再重新登录;

exec /bin/bash;

(2)使用source命令重新加载指定配置文件:

source /etc/profile

注意:使用source命令会有副作用。例如:

	#在~/.bash_profile中定义PATH环境变量,文件尾部添加以下行:
PATH=$PATH:$HOME/bin
export PATH
	#执行source并查看PATH环境变量:
[[email protected] ~]# echo $PATH
/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
[[email protected] ~]# source .bash_profile 
[[email protected] ~]# source .bash_profile 
[[email protected] ~]# source .bash_profile 
[[email protected] ~]# echo $PATH
/root/shell:/root/shell:/root/shell:/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/root/bin:/root/bin:/root/bin

可以看到/root/shell出现了多次,所以应尽量使用exec命令。

扩展:

 install

copy files and set attributes

install [OPTION]... [-T] SOURCE DEST

install [OPTION]... SOURCE... DIRECTORY

install [OPTION]... -t DIRECTORY SOURCE...

install [OPTION]... -d DIRECTORY...

-o, --owner=OWNER:指定属主

-g, --group=GROUP:指定属组

-m, --mode=MODE:指定权限,3位八进制表示

与cp命令区别在intall能在复制的同时指定属主属组权限信息。

实例:

[[email protected] ~]# ls -l /etc/fstab 
-rw-r--r--. 1 root root 595 Mar  4 02:40 /etc/fstab
[[email protected] ~]# install -o fred -g fred -m 664 /etc/fstab .
[[email protected] ~]# ls -l fstab 
-rw-rw-r--. 1 fred fred 595 Mar  8 11:25 fsta

mktemp

create a temporary file or directory

mktemp [OPTION]... [TEMPLATE]

-d, --directory:创建目录而非文件

-p DIR, --tmpdir[=DIR]:指定临时文件目录,默认为当前目录

此命令会使用随机字符作为文件名的一部分,来实现创建临时文件,以保证创建的临时使用文件不与其他文件重名导致数据丢失。使用3个及以上的“X”表示随机字符。

实例:

[[email protected] ~]# mkdir tempdir
[root[email protected] ~]# mktemp -p tempdir testfile.XXX.txt
tempdir/testfile.5NK.txt
[[email protected] ~]# ls tempdir/
testfile.5NK.txt
时间: 2024-07-28 23:16:07

bash配置与shell脚本编程的相关文章

shell脚本编程之算数运算

#/bin/bash 在进行shell脚本编程之前一定要在脚本的开头加上上头这一句话,并且要顶着头写,前头不能有空格和空行.这句话的意思是告诉系统用哪一种shell来执行此脚本.如果没有这句话就有可能发生一些意想不到的错误. 接下来说一说在shell脚本中或命令行中如何进行算数运算.也许你已经发现,因为shell中的变量的格式都为字符类型,所以如果只是简单的让一个变量去等于一个表达式的话,那么当输出此变量的时候输出的还是哪个表达式,而并不是表达式所得出来的结果,比如:  ~]$ a=1+2  ~

文本处理工具和正则表达式、SHELL脚本编程

一.文本编辑工具VIM ●命令模式 --> 插入模式 i     insert, 在光标所在处输入 I     在当前光标所在行的行首输入 a    append, 在光标所在处后面输入 A    在当前光标所在行的行尾输入 o    在当前光标所在行的下方打开一个新行 O   在当前光标所在行的上方打开一个新行 ●插入模式 --- ESC-----> 命令模式 ●命令模式 ----:----> 扩展命令模式 ●扩展命令模式 ---ESC,enter---->命令模式 1.进入编辑

Linux中的shell脚本编程——数组 ,高级字符串操作 ,高级变量 ,配置用户环境

概述: 概述: 本章节将讲述Linux中shell脚本编程的数组,高级字符串处理,高级变量和配置用户的环境. 一.函数和位置参数扩展 1.shift 命令实现在位置参数中的跳跃,会把最左边的参数挤掉     2.匿名函数的使用 第一篇:数组 一.数组的定义: 1.变量:存储单个元素的内存空间 2.数组:存储多个元素的连续的内存空间,相当于多个变量的集合. 3.数组名和索引 索引:编号从0开始,属于数值索引 注意:索引可支持使用自定义的格式,而不仅是数值格式,即为关联索引,bash4.0版本之后开

Bash Shell脚本编程笔记总结(二)

本文接上一部分:Bash Shell脚本编程笔记总结(一) 数组: 连续的多个独立内存空间,每个内存空间相当于一个变量 数组元素:数组名+索引 索引:从0开始编号 声明数组: declare -a ARRAR_NAME 关联数组: declare -A ARRAY_NAME 支持稀疏格式: 数组元素的赋值: (1) 一次只赋值一个元素 ARRAY[index]=VALUE a[0]="hello" (2) 一次赋值全部元素 ARRAY=("mon" "tu

在Bash shell脚本编程中,如何正确无误获取到“脚本选项参数”和“脚本参数”呢?

Linnux 中有些命令的功能非常强大,主要是因为它支持的命令选项比较多.如:[ip]命令可以配置IP地址.路由条目的配置管理操作非常完善,该命令就可以完成[ifconfig]和[route]命令实现的所有功能.函数是单独的功能模块,如果函数能够接收选项参数,那么该函数的功能就变得丰富,且灵活.脚本也是一样. 那么linux中命令的格式又是怎么样的呢? [[email protected] ~]# command   [optons parameter1 | parameter2]...  pa

8.11_Linux之bash shell脚本编程入门篇(一)

什么是bash shell脚本编程? 答:Linux里面有多种shell,而CentOS和redhat的默认shell是bash shell.至于shell脚本,这个跟windows操作系统里面的批处理文件有点像(.bat的文件).不知道大家还是否记得Linux的哲学思想吗?其中有那么两点点:由众多目的的单一应用程序组成:一个程序只做一件事,且做好:组合目的的单一的小程序完成复杂的任务.我觉得shell脚本编程就很好的体现了这个哲学思想.shell脚本利用shell的功能缩写的一个"程序&quo

Bash Shell脚本编程笔记总结(一)

本文是上课笔记总结,涉及细节知识点会在以后文章说明! bash脚本编程: 脚本程序:解释器解释执行: shell: 交互式接口:编程环境: shell: 能够提供一些内部命令,并且能通过PATH环境变量找到外部命令:把命令提交给内核启动为进程: 编程环境: 流程控制语句: 顺序执行: 循环执行: 选择执行: 条件测试:真.假 $? 命令的状态结果: 0: 真 1-255: 假 过程式的编程语言的元素:变量.流程.函数.数组 变量:局部变量.本地变量.环境变量.位置参数变量.特殊变量 变量: 数值

8.15_Linux之bash shell脚本编程入门篇(二)以及文件查找和压缩的使用

bash shell脚本编程入门篇(二) read命令的使用 作用: 使用read来把输入值分配给一个或多个shell变量: -p指定要显示的提示 -t TIMEOUT read从标准输入中读取值,给每个单词分配一个变量,所有剩余单词都被分配给最后一个变量 EX.read -p "Enter a filename:" FILE 条件选择之if的使用 if的作用:选择执行(注意:if语句可嵌套) 单分支 if 判断条件;then 条件为真的分支代码 fi EX.单分支案例 双分支 if

8.17_Linux之bash shell脚本编程入门篇(三)之循环以及函数function的使用

bash shell脚本编程入门篇(三)之循环 什么是循环执行? 将某代码段重复运行多次 重复运行多少次: 循环次数事先已知 循环次数事先未知 有进入条件和退出条件 相关命令:for, while, until,selet, for命令的使用 作用: 依次将列表中的元素赋值给"变量名"; 每次赋值后即执行一次循环体; 直到列表中的元素耗尽,循环结束 命令格式: for 变量名 in 列表; do 循环体(正常执行的执行命令) 语句1 语句2 语句3 ... done 列表生成方式: (