Shell编程入门--概念、特性、bash配置文件

news2025/3/10 14:50:05

目录

  • 一、Shell概念
    • 1.定义
    • 2.分类和使用场景
      • 2.1.分类和切换
      • 2.2.使用场景
    • 3.特性
      • 3.1.文件描述符与输出重定向
      • 3.2.历史命令---history
      • 3.3.别名 --alias
      • 3.4.命令排序执行
      • 3.5.部分快捷键
      • 3.6.通配符置换
    • 4.脚本规范
    • 5.脚本运行方式
      • 5.1.bash脚本执行
      • 5.2.bash脚本测试
  • 二、bash配置文件
    • 1.全局配置文件
    • 2.个人配置文件

一、Shell概念

1.定义

  • 程序 语言 编程
  • 语言:自然语言(汉语 英语)、计算机语言(c语言、c++、java、php、python、go、shell)
  • 编译型语言:c、c++、java
  • 解释型语言:php、python、bash(shell)

编译型语言:编译型语言的首先将源代码编译生成机器语言,再由机器运行机器码(二进制)。像C/C++等都是编译型语言。
解释型语言:源代码不是直接翻译成机器语言,而是先翻译成中间代码,再由解释器对中间代码进行解释运行。比如Python/JavaScript/Shell等都是解释型语言

c 编译型执行代码需要编译成cpu能认识的二进制码 x86指令集
java 编译型执行编译–>字节码,cpu不能直接运行,只能被Java虚拟机执行
shell 解释型语言执行 慢

编译型语言的执行方式
在这里插入图片描述
解释型语言的执行方式
在这里插入图片描述
Shell定义

Shell 也是一种程序设计语言,它有变量,关键字,各种控制语句,有自己的语法结构,利用shell程序设计语言可以编写功能很强、代码简短的程序。
shell是外壳的意思,就是系统的外壳,我们可以通过shell的命令来控制和操作操作系统,比如linux中的shell命令就包括ls、cd、pwd等等,总结来说shell就是一个命令解释器,他通过接收用户输入的shell命令来启动、停止程序的运行或者对计算机进行控制。

2.分类和使用场景

2.1.分类和切换

[root@localhost ~]# cat /etc/shells    //查看所有shell
/bin/sh
/bin/bash    //默认的shell
/usr/bin/sh    //centos中脚本使用的默认shell
/usr/bin/bash

[root@localhost ~]# echo $SHELL    //查看当前正在使用的shell
/bin/bash

[root@localhost ~]# vim /etc/passwd  //编辑登录shell

2.2.使用场景

Shell 能做什么?

  1. 自动化批量系统初始化程序 (update,软件安装,时区设置,安全策略…)—初始化脚本
  2. 自动化批量软件部署程序 (LAMP,LNMP,Tomcat,LVS,Nginx)—一键安装la/nmp环境,通过脚本自动上线代码
  3. 应用管理程序 (KVM)—通过脚本批量创建虚拟机
  4. 日志分析处理程序(PV, UV, 200, !200,grep/awk/sed)
  5. 自动化备份恢复程序(MySQL完全备份/增量 + Crond)
  6. 自动化信息采集及监控程序(收集系统/应用状态信息,CPU、Mem、Disk、Net、TCP Status、Apache、MySQL)
  7. 配合Zabbix信息采集(收集系统/应用状态信息,CPU、Mem、Disk、Net、Apache、MySQL)
  8. Shell可以做任何运维的事情(一切取决于业务需求)

3.特性

3.1.文件描述符与输出重定向

在 shell程序中,最常使用的FD (file descriptor) 大概有三个,分别是:
  0: Standard Input (STDIN)
  1: Standard Output (STDOUT)
  2: Standard Error Output (STDERR)
在标准情况下, 这些FD分别跟如下设备关联:
  stdin(0): keyboard 键盘输入,并返回在前端
  stdout(1): monitor 正确返回值 输出到前端
  stderr(2): monitor 错误返回值 输出到前端

将程序的标准输出(stdout)和标准错误(stderr)一起重定向到一个文件(该用法最常用):&> a.txt
将标准输出(stdout)重定向到标准错误(stderr),用的较少(了解即可):1 >&2
将标准错误(stderr)重定向到标准输出(stdout),用的较少(了解即可):2 >&1
一般来说, “1>” 通常可以省略成 “>”

1.例子,当前目录下只有a.txt,没有b.txt
[root@localhost ~]# touch a.txt
[root@localhost ~]# ls a.txt b.txt  >file.out  2>&1
[root@localhost ~]# cat file.out 
ls: cannot access b.txt: No such file or directory
a.txt

2.或者也可以:
[root@localhost ~]# ls a.txt b.txt &>cat.txt
[root@localhost ~]# cat cat.txt
ls: 无法访问b.tx: 没有那个文件或目录
a.txt

 3.通过cat的方式将内容写入到文件中
[root@localhost ~]# cat >> b.txt <<eof
> ni hao a haha
> eof
[root@localhost ~]# cat b.txt 
ni hao a haha

//注:这里也可以使用EOF需要成对使用即可!

3.2.历史命令—history

上下健
! 关键字
! 历史命令行号
!! 执行上一条命令
!$ 上一条命令的最后一个参数
esc . 上一条命令的最后一个参数
Ctrl+r 在历史命令中查找,输入关键字调出之前的命令

3.3.别名 --alias

[root@localhost ~]# alias    //查看别名
alias cp='cp -i'
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias grep='grep --color=auto'
alias l.='ls -d .* --color=auto'
alias ll='ls -l --color=auto'
alias ls='ls --color=auto'
alias mv='mv -i'
alias rm='rm -i'
alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'

设置别名 
1.临时设置
[root@localhost ~]# aa=88    
[root@localhost ~]# echo $aa
88

2.永久设置
[root@localhost ~]# vim /root/.bashrc
aa=88
[root@localhost ~]# source /root/.bashrc  //让文件生效

3.4.命令排序执行

&& 逻辑与,前面执行成功,后面才执行。前面命令执行失败,后面命令也不执行
|| 逻辑或,前面执行失败,后面执行,前面命令执行成功,后面不执行。
; 从左往右按顺序执行,不管前面执行成功与否,后面都执行

3.5.部分快捷键

Ctrl+a 切换到命令行开始(跟home一样,但是home在某些unix环境下无法使用)
Ctrl+u 清除剪切光标之前的内容
Ctrl+k 清除剪切光标之后的内容
ctrl+y 粘贴刚才所删除的字符
Ctrl+r 在历史命令中查找,输入关键字调出之前的命令
Ctrl+l 清屏
Ctrl+c 终止
Ctrl+e 切换到命令行末尾

3.6.通配符置换

在 Shell命令中,通常会使用通配符表达式来匹配一些文件
*    ?    []    {}

字符含义实例
*匹配 0 或多个字符a*b a与b之间可以有任意长度的任意字符,也可以一个也没有, 如aabcb, axyzb, a012b, ab
?匹配任意一个字符a?b a与b之间必须也只能有一个字符,可以是任意字符, 如aab, abb, acb, a0b
[list]匹配 list 中的任意单一字符a[xyz]b a与b之间必须也只能有一个字符,但只能是 x 或 y 或 z, 如: axb, ayb, azb
[!list]匹配 除list 中的任意单一字符a[!0-9]b a与b之间必须也只能有一个字符,但不能是阿拉伯数字, 如axb, aab, a-b
[c1-c2]匹配 c1-c2 中的任意单一字符[0-9] [a-z] a[0-9]b 0与9之间必须也只能有一个字符 如a0b, a1b… a9b
{string1,string2,…}匹配 sring1 或 string2 (或更多)其一字符串a{abc,xyz,123}b a与b之间,只能是abc或xyz或123这三个字符串之一
[root@localhost tmp]# rm -rf *
[root@localhost tmp]# touch aabcb axyzb a012b ab acb
[root@localhost tmp]# ls
a012b  aabcb  ab  acb  axyzb
[root@localhost tmp]# ls a*b
a012b  aabcb  ab  acb  axyzb
[root@localhost tmp]# ls a?b
acb

[root@localhost tmp]# rm -rf *
[root@localhost tmp]# touch axb ayb azb axyb
[root@localhost tmp]# ls
axb  axyb  ayb  azb
[root@localhost tmp]# ls a[xy]b
axb  ayb
[root@localhost tmp]# ls a[!xy]b
azb
[root@localhost tmp]# ls a[!x]b
ayb  azb

[root@localhost tmp]# rm -rf *
[root@localhost tmp]# touch a0b a1b a9b
[root@localhost tmp]# ls a[0-9]b
a0b  a1b  a9b

[root@localhost tmp]# rm -rf *
[root@localhost tmp]# touch aabcb axyzb a012b ab
[root@localhost tmp]# ls a{abc}b        //a{abc}b被当作文件名
ls: cannot access a{abc}b: No such file or directory
[root@localhost tmp]# ls a{abc,}b
aabcb  ab
[root@localhost tmp]# ls a{abc,xyz}b
aabcb  axyzb
[root@localhost tmp]# ls a{abc,xyz,012}b
a012b  aabcb  axyzb
//拓展
[root@localhost tmp]# ls a[0-9a-z][0-9a-z][0-9a-z]b
a012b  aabcb  axyzb

4.脚本规范

[root@localhost ~]# vim helloworld.sh   //.sh代表这个文件是个shell脚本,拓展名后缀,如果省略.sh则不易判断该文件是否为shell脚本
1. #!/usr/bin/env bash        //shebang蛇棒, 解释器, 翻译 
2. #
3. # Author: soso666
4. # Email: soso666@163.com       //一些注释,可以解释一下脚本作用
5. # Github: https:github.com/soso666
6. # Date: 2019/12/24
7. printf "hello world"
    //功能说明:打印hello world

[root@localhost ~]# sh helloworld.sh 
hello world

5.脚本运行方式

5.1.bash脚本执行

[root@localhost ~]# vim /opt/test/script/test.sh
#!/bin/bash
# 获取主机基本信息
time=`date +%F-%T`              #等同于 $(date +%F-%T)
#ifconfig命令需要安装net-tools工具包
ip=`ifconfig |grep broadcast|awk '{print $2}'`
echo "现在的时间是:" $time
echo "当前的用户是:" $USER
echo "当前的用户标识:" $UID
echo "当前的主机名称是:" $HOSTNAME
echo "当前可用网卡IP是:" $ip

[root@localhost ~]# cd /opt/test/script/

1.source 文件名
使用当前shell(父shell)执行 比如cd /tmp会改变当前shell环境,但是其他的方式不会

[root@localhost script]# source test.sh
现在的时间是: 2023-09-07-19:52:54
当前的用户是: root
当前的用户标识: 0
当前的主机名称是: localhost.localdomain
当前可用网卡IP是: 192.168.221.136

2.bash或者sh 文件名

[root@localhost script]# bash test.sh
现在的时间是: 2023-09-07-19:53:03
当前的用户是: root
当前的用户标识: 0
当前的主机名称是: localhost.localdomain
当前可用网卡IP是: 192.168.221.136

[root@localhost script]# sh test.sh
现在的时间是: 2023-09-07-19:53:09
当前的用户是: root
当前的用户标识: 0
当前的主机名称是: localhost.localdomain
当前可用网卡IP是: 192.168.221.136

3.相对路径或者绝对路径
需要提前授权

[root@localhost script]# ./test.sh
-bash: ./test.sh: 权限不够
[root@localhost script]# chmod +x ./test.sh

[root@localhost script]# ./test.sh
现在的时间是: 2023-09-07-19:56:25
当前的用户是: root
当前的用户标识: 0
当前的主机名称是: localhost.localdomain
当前可用网卡IP是: 192.168.221.136

[root@localhost script]# /opt/test/script/test.sh
现在的时间是: 2023-09-07-19:56:36
当前的用户是: root
当前的用户标识: 0
当前的主机名称是: localhost.localdomain
当前可用网卡IP是: 192.168.221.136

5.2.bash脚本测试

1.这将执行该脚本并显示所有变量的值

[root@localhost ~]# sh -x /root/helloworld.sh
+ printf 'hello world'
hello world

2.不执行脚本只是检查语法模式,将返回所有错误语法

[root@localhost ~]# sh -n /root/helloworld.sh

3.执行脚本前把脚本内容显示在屏幕上

[root@localhost ~]# sh -v /root/helloworld.sh
#!/usr/bin/env bash
#
# Author: soso666
# Email: soso666@163.com
# Github: https:github.com/soso666
# Date: 2019/12/24
printf "hello world"
hello world

二、bash配置文件

1.全局配置文件

/etc/bashrc、/etc/profile、/etc/profile.d/*.sh

如果修改/etc/profile文件修改出错,导致无法敲系统命令,例如:ls,怎么解决呢?
在命令行中输入
export PATH=$PATH:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/opt/bin
然后将该命令【追加】到/etc/profile文件中,修改完后
source /etc/profile

2.个人配置文件

~/.bash_profile、~/.bashrc

profile类的文件:设定环境变量,运行命令或脚本,用户在登录的时候会自动生效
bashrc类的文件:定义命令别名

用户登录时加载bash配置文件的过程:
登录式shell加载配置文件过程:先个人,再公共;先局部,再全局
~/.bash_profile --> ~/.bashrc --> /etc/bashrc —> /etc/profile --> /etc/profile.d/*.sh
这里的优先级是影响范围最小的优先级最高

非登录式shell加载配置文件过程
~/.bashrc --> /etc/bashrc --> /etc/profile.d/*.sh

下面的文件为系统的每个用户设置环境信息Shell设置文件:
/etc/profile(系统级)启动时执行
        这是系统最主要的shell设置文件,也是用户登陆时系统最先检查的文件,有关重要的【环境变量】都定义在此,其中包括 PATH,USER,MAIL,HOSTNAME,HISTSIZE,INPUTRC等。而在文件的最后,它会检查并执行/etc/profile.d/*.sh的脚本。
~/.bash_login(用户级)登录时执行,默认不存在
        如果~/.bash_profile文件不存在,则系统会转而读取.bash_login这个文件内容。这是用户的登陆文件,在每次用户登陆系统时,bash都会读此内容,所以通常都会将登陆后必须执行的命令放在这个文件中。
~/.bash_logout 离开时执行如果想在注销shell前执行一些工作,都可以在此文件中设置。
例如:vi ~.bash_logout
         clear #仅执行一个clear命令在你注销的时候
~/.bash_history(用户级) 这个文件会记录用户先前使用的历史命令。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1198004.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Oracle(18)Auditing

文章目录 一、基础知识1、审计介绍2、Auditing Types 审计类型3、Auditing Guidelines 审计准则4、Auditing Categories 审核类别5、Database Auditing 数据库审计6、Auditing User SYS 审计sys用户7、Getting Auditing Informatio 获取审计信息8、获取审计记录通知 二、基础操…

(三)、MySQL索引

一、索引基础 索引是存储引擎用于快速找到记录的一种数据结构。(可以理解为一本书的目录)。 例子&#xff1a;where id1 如果在id列上建有索引&#xff0c;则MySQL将使用该索引找到id为1的行&#xff0c;也就是说&#xff0c;MySQL先在索引上按值进行查找&#xff0c;然…

Java10新增特性

版本介绍 Java 10 的发布时间是2018年3月20日。这是在Java 9之后&#xff0c;采用了基于时间发布的策略&#xff0c;每6个月一个版本。这是采用新的发布策略之后的第一个版本。 Java 10 是Java版本历史上最快的一个版本。它打破了Java缓慢增长和进化的概念。它是一个具有许多…

【树与二叉树的转换,哈夫曼树的基本概念】

文章目录 树与二叉树的转换将二叉树转化为树森林与二叉树的转化&#xff08;二叉树与多棵树之间的关系&#xff09;二叉树转换为森林森林的先序遍历1&#xff09;先序遍历2&#xff09;后序遍历 哈夫曼树的基本概念森林转换成二叉树&#xff08;二叉树与多棵树的关系&#xff0…

Sensor 点亮出图后,颜色偏红或者偏绿是为什么?

这是因为 sensor balck level 的值配置的不正确导致&#xff0c;black level 的值一般在效果参数的 calibration 参数里面。 在驱动调试阶段&#xff0c;我们一般都是复用其他已调试好的&#xff0c;sensor 的驱动文件及效果文件&#xff0c; 而不同 sensor 的 balck level 的…

YOLOv8-Seg改进:分割注意力系列篇 | 高效的通道先验卷积注意力(CPCA) | 中科院 2023.6

🚀🚀🚀本文改进:高效的通道先验卷积注意力(CPCA)方法,支持注意力权重在通道和空间维度上的动态分布; 🚀🚀🚀CPCA 小目标分割检测&复杂场景首选,实现涨点 🚀🚀🚀YOLOv8-seg创新专栏:http://t.csdnimg.cn/KLSdv 学姐带你学习YOLOv8,从入门到创新…

奇舞周刊第510期:浏览器和图形引擎渲染对比

记得点击文章末尾的“ 阅读原文 ”查看哟~ 下面先一起看下本期周刊 摘要 吧~ 奇舞推荐 ■ ■ ■ 浏览器和图形引擎渲染对比 本文从介绍浏览器渲染引擎开始&#xff0c;逐渐引出和图形引擎的比较&#xff0c;尝试从图形视角探索和理解浏览器的渲染原理。 Next.js的崛起&#xff…

消息队列使用场景

&#x1f388;个人公众号:&#x1f388; :✨✨✨ 可为编程✨ &#x1f35f;&#x1f35f; &#x1f511;个人信条:&#x1f511; 知足知不足 有为有不为 为与不为皆为可为&#x1f335; &#x1f349;本篇简介:&#x1f349; 本篇记录消息队列使用场景&#xff0c;如有出入还望…

基于STC12C5A60S2系列1T 8051单片机串口通信信应用

基于STC12C5A60S2系列1T 8051单片机串口通信应用 STC12C5A60S2系列1T 8051单片机管脚图STC12C5A60S2系列1T 8051单片机串口通信介绍STC12C5A60S2系列1T 8051单片机串口通信的结构基于STC12C5A60S2系列1T 8051单片机串口通信的特殊功能寄存器列表基于STC12C5A60S2系列1T 8051单片…

力扣字符串--总结篇

前言 字符串学了三天&#xff0c;七道题。初窥kmp&#xff0c;已经感受到算法的博大精深了。 内容 对字符串的操作可以归结为以下几类&#xff1a; 字符串的比较、连接操作&#xff08;不同编程语言实现方式有所不同&#xff09;&#xff1b; 涉及子串的操作&#xff0c;比…

Sagemaker基础操作指南

简介 Amazon SageMaker是亚马逊AWS提供的一项托管式机器学习服务&#xff0c;旨在简化和加速机器学习开发的整个生命周期。它为机器学习工程师和数据科学家提供了一套完整的工具和功能&#xff0c;用于构建、训练、调优和部署机器学习模型。本文将会通过一个简单的例子&#x…

linux_day02

1、链接&#xff1a;LN 一个点表示当前工作目录&#xff0c;两个点表示上一层工作目录&#xff1b; 目录的本质&#xff1a;文件&#xff08;该文件储存目录项&#xff0c;以链表的形式链接&#xff0c;每个结点都是目录项&#xff0c;创建文件相当于把目录项添加到链表中&…

111111111111111

全局锁 就是对整个数据库进行加锁&#xff0c;加锁之后整个数据库就处于只读状态&#xff0c;后续的DML写语句&#xff0c;DDL语句&#xff0c;以及对更新事务的提交操作都会被阻塞&#xff0c;典型地使用场景就是做整个数据库的逻辑备份&#xff0c;对所有的表进行锁定&#x…

LIBGDX实时绘制字符、实时绘制中文

LIBGDX实时绘制字符、实时绘制中文 转自&#xff1a;https://lingkang.top/archives/libgdx-shi-shi-hui-zhi-zi-fu 注意&#xff0c;相比于贴图字体&#xff0c;实时绘制会有一定的失真、模糊 Maven项目依赖&#xff1a; <properties><maven.compiler.source>…

【Java 进阶篇】Java中的 JSP(JavaServer Pages)

JavaServer Pages&#xff08;JSP&#xff09;是一种用于开发动态Web页面的Java技术。它是在静态Web页面中嵌入Java代码的一种方式&#xff0c;使得开发者可以借助Java的强大功能来创建动态、交互性强的Web应用程序。在本文中&#xff0c;我们将深入探讨JSP的概念、原理和基本用…

算法:FloodFill算法

文章目录 算法原理图像渲染岛屿数量岛屿的最大面积被围绕的区域太平洋大西洋水流问题扫雷游戏衣橱整理 算法原理 FLoodFill算法通俗来讲&#xff0c;就是洪水给地势带来的变化&#xff0c;而实际上题目要求的就是一个连通块问题&#xff0c;那本质还是暴搜和DFS/BFS相结合&…

vue做的一个一点就转的转盘(音乐磁盘),点击停止时会在几秒内缓慢停止,再次点击按钮可以再次旋转,

先看效果&#xff1a; 代码&#xff1a;主要部分我会红线画出来 css:部分&#xff1a; 源码&#xff1a; vue部分&#xff1a; <template><div class"song-lyric"><div><div class"type"><div class"right">&l…

【Git】git常用命令大全

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是Java方文山&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;推荐给大家我的专栏《Git》。&#x1f3af;&#x1f3af; &#x1f449…

实体店铺必看:如何申请低手续费或免手续费的收款码

在数字支付日益普及的今天&#xff0c;为实体店铺如餐饮店引入低成本甚至免手续费的收款解决方案变得尤为重要。本文将详细介绍实体店铺如何申请低手续费或免手续费的收款码&#xff0c;助您降低运营成本&#xff0c;提升业务效率。 一、了解不同支付平台的政策 首先&#xf…

性能测试之性能调优详解

性能测试是通过模拟实际使用场景&#xff0c;对系统进行压力测试和负载测试&#xff0c;以评估系统的性能指标&#xff0c;如响应时间、吞吐量和并发能力等。通过性能测试可以发现系统的瓶颈和性能问题&#xff0c;并针对性地进行优化。 监控工具可以实时监测系统的运行状态和…