Bash 基础学习笔记

Linux Bash编程 在《Linux系统介绍》中,介绍了shell的多个版本,现在的Linux发行版基本都默认使用bash(Bourne Again shell),兼容Bourne shell (sh),本文将简要介绍Bash编程语法。 变量 命名规则 只能使用英文字母,数字和下划线,首个字符不能以数字开头 中间不能有空格,可以使用下划线(_) 不能使用标点符号 不能使用bash里的关键字(可用help命令查看保留关键字) 定义与使用变量 定义变量 your_name="abc" echo $your_name 拼接字符 阅读详情

GNU/Linux支持多种版本的shell. 但默认的是bash. /etc/shells文件列出了本机linux系统支持的shell类型. /etc/passwd中列出了用户默认的登录shell.
从当前shell转换到另一种shell: 直接在命令行输入对应的shell程序名.如:
$ sh
sh-3.00$
提示符变了, 要退回到之前的bash, 可输入exit或使用C-d组合键.
bash的特色


1, 命令行参数: sh只能传送单字符参数(可通过内置的set命令配置), bash还可以传送字符串参数.
2, 启动配置文件: bash启动时, 依次读取启动文件, 这样可以在bash启动时完成一些默认的配置工作. (关于bash配置文件, 后面再讨论).
3, bash是交互性shell.
4, 条件表达式.
5, shell算术.
6, 别名.
7, 数组
8, 目录栈.
9, 受限版的bash: rbash.
bash命令的执行
bash能够识别要执行内容的类型: 是系统中的可执行程序, 还是bash的内置命令, 或者是一个bash脚本? 根据这些类型, bash的执行方式有所不同:
1, 可执行程序: 遵循fork-exec形式, 它fork出一个子bash进程, 父bash和子bash仅进程号不同. 注意这种情况下, 父进程等待子进程执行, 子bash执行完毕退出后, 父bash重新执行. 程序对子bash的环境做出的更改不会影响父bash.
2, bash内嵌命令: bash直接执行命令, 不新生成一个进程.
3, bash脚本: 分两种情况:
(1) 如果直接执行脚本, 比如: $ ./foo.sh , 此情况与执行可执行程序相同, 生成的子bash进程一次从脚本读取一行命令来执行, 如同用户从键盘输入命令.
(2) 如果执行 $ source ./foo.sh, 这相当于执行bash的内嵌命令, 也可以起到执行脚本命令的作用, 但不生成新的bash. 所以如果需要在脚本中更改bash环境变量的话, 要用source命令! 直接运行脚本只能更改fork出的子bash的环境变量, 运行结束后, 子bash退出, 父bash的环境变量不受影响.
编写bash脚本
1, 推荐使用能够显示bash语法高亮的编辑器, 比如emacs, gedit, vim...
2, 自己编写的脚本怎样命名, 放在什么地方?
命名: 为了避免自己写的脚本与系统命令重名, 建议shell脚本以.sh结尾. 但自己写的脚本还是可能与系统自带的脚本重名, 建议命名前通过$ which scriptname.sh (或者whereis, locate)来查看.
位置: 可以将自己写的脚本放在一个合适的目录中, 比如~/script.

Unix/Linux不利用文件扩展名来判断文件类型. 要想知道文件类型, 可使用file命令.

3, 如何执行脚本?
(1) 脚本可以像命令一样被执行:
$ /bin/bash file.sh (不需要file.sh的可执行权限)
如果你懒得输入/bin/bash, 可以采取下面的两种方法:
如果脚本被集中放置在~/script目录, 可以将该目录添加到PATH中再直接调用
$ export PATH="$PATH:~/script"
由于脚本所在的目录在PATH环境变量中, 所以可直接运行: $ file.sh (需要file.sh有可执行权限)
如果想执行当前目录的脚本, 可以运行$ ./scriptname.sh  (需要file.sh有可执行权限)
方法(1)使bash新生成一个子bash来执行, 在此情况下, 脚本对环境变量的更改只对子bash有效.并且在执行脚本文件之前必须更改权限(指明shell路径时不用), 让脚本具有相应的执行权限.
(2) 可使用source命令来直接执行脚本(可用'.'来代替source). 它与上面的方法有两点区别:
1, 脚本文件不需要执行权限.
2, 就在当前bash中执行, bash不会新fork一个子bash来执行它, 所以脚本对环境变量的更改会影响到当前bash.

推荐使用./file.sh在当前目录执行脚本, 这样可以避免误调系统其他位置的重名脚本. 如果需要更改当前shell的环境变量, 则使用source命令. 不推荐修改环境变量: 这会造成系统的安全隐患.

当你确认脚本运行无误, 而且需要经常执行它时, 可将它copy到合适的系统执行目录, 比如/usr/bin, /usr/local/bin 或者~/bin(需修改PATH)中. 然后向调用命令一样执行它.
脚本结构


脚本开头第一行指定运行脚本的shell, 一般指定为bash:
#!/bin/bash

bash脚本中的注释以'#'开头, #之后到行尾的内容为注释, 在执行时会被bash忽略. (脚本中不能再在同一行的注释之后添加命令, #之后到行尾的内容都会被bash忽略!)  但脚本开头的#!是个例外!

在脚本结尾的最后一行, 一般包含一个 "exit 0" 语句(0表示执行成功). 它返回一个值. 注意: 在交互式bash中, 这条命令没什么用处. 当它所在的脚本被被的脚本调用时, 就能确定被调用的脚本是否正确执行了. 你的脚本在将来可能被别的脚本所调用, 所以最好在脚本末尾包含这条语句. 这也是编写可重用脚本的一个好习惯.
调试脚本


调试整个脚本
最通用的方法是新调用一个bash, 以调试选项"-x"来执行脚本: $ bash -x scriptname.sh
这种情况下, 新bash在显示每个语句生成的结果之前打印出该语句(以+开头), 这样易于我们对比语句和执行结果.
调试脚本的部分内容
只需在脚本中你想调试的语句之前添加: set -x, 然后在结尾添加: set +x. 可以把这两条语句当作"调试开关", 在脚本中多次调用.
调试选项归纳如下:
Short notation    Long notation    Result
set -f    set -o noglob    Disable file name generation using metacharacters (globbing).
set -v    set -o verbose    Prints shell input lines as they are read.
set -x    set -o xtrace    Print command traces before executing command.
注意, -为打开启用调试,+为关闭调试,这容易混淆.
这些选项不光可以添加到脚本文件中, 还可以直接在命令行中指定.
e.g:
$ set -x
$ ls
看看结果吧 :)
bash环境
启动配置文件的读取
首先要理解: 交互式bash和非交互式bash(interactive& non-interactive)
交互式shell: 用户输入命令给shell执行, shell将执行的结果通过输出反馈给用户.
非交互式shell: 命令(脚本)在后台执行, 执行过程中不读取用户输入, 也不反馈执行信息.(执行完毕后可能会显示一些信息).

如何判断某个shell是不是交互式的呢? 可以运行 $ echo &-, 若输出中还有小写字母'i', 则是交互式shell. 一般而言, terminal或console都是交互式shell, 而shell脚本在执行时执行它的shell就是非交互式的.

交互式bash还有两种调用方式: login和non-login.
login: 我们在文本模式下登录console时, bash提示输入用户名和密码, 此时的bash就是login的.
non-login: 在图形模式下, 打开一个 terminal, 不需要输入用户明或密码, 此时调用的bash就是non-login的.
根据login和non-login的区别, bash在启动时读取不同的配置文件:
login:
1, 读取/etc/profile: 它是所有用户, 所有shell的启动配置文件. /etc/profile还会读取/etc/bash.bashrc, 它是所有用户的bash启动配置文件.
2, 读取~/.bash_profile, 若它不存在, 则读取~/.bash_login 同样, 若前两者不存在, 读取~/.profile.
3, 在logout时读取~/.bash_logout
non-login:
读取~/.bashrc.

可以自行在上述的配置文件的末尾添加echo语句, 这样在console中登录或者打开一个终端时就能显示配置文件的读取信息. 上面的总结基于Ubuntu, 各发行版可能情况不同.

non-interactive:
读取的文件由BASH_ENV定义. 这些文件要用全路径, 因为无法用PATH变量来搜寻这些文件.
bash的初始化文件


一, 针对整个系统所有用户的login配置文件.
1, 针对整个系统的所有用户, 所有shell的配置文件  /etc/profile
# System wide environment and startup programs, for login setup
注意: 该配置文件被交互式login shell读取, 以bash为例, 在图形模式下打开terminal时是交互式non-login的, 所以不会读取/etc/profile: 运行 $ bash, 不会读取/etc/profile. 但如果以 $ bash --login, 则会读取.
在字符界面下, 最初登录时会读取/etc/profile. 登录后的情形等同于图形界面的terminal.
2, 针对整个系统所有用户, bash的配置文件 /etc/bash.bashrc
它一般会被/etc/profile读取以配置bash环境.
二, 针对单个用户的login配置文件
这些配置文件默认位于用户的home目录, 以.开头, 是隐藏文件. 如果它们不存在, 可以创建它们.
1, ~/.bash_profile
This is the preferred configuration file for configuring user environments individually. In this file, users can add extra configuration options or change default settings.
与/etc/profile相同, ~/.bash_profile在交互式, login情况下被读取.
如果~/.bash_profile不存在, 则读取~/.bash_login, 若~/.bash_login也不存在, 则读取~/.profile.
三, 针对单个用户的login-out配置文件
在logout时候, bash读取~/.bash_logout文件.
四, 针对单个用户的non-login配置文件
~/.bashrc
在图形模式下, non-login bash更为广泛地存在: 打开一个terminal一般不会读取/etc/profile或~/.bash_profile文件, 因为图形模式下打开终端时是non-login的. 这种情况下通过~/.bashrc来配置.
~/.bashrc是否会被读取的情况等同于/etc/profile和~/.bash_profile.

这样, 我们就知道在定制bash环境时, 如何针对自己的需要修改这些配置文件了:
login情形下, 针对所有用户的定制: /etc/bash.bashrc;  针对单个单个用户的定制: 修改~/.bash_profile
non-login情形下: 针对所有用户的定制: /etc/bash.bashrc; 针对单个用户的定制:  修改~/.bashrc
注意: /etc/bash.bashrc会被login或non-login的bash读取!

对这出配置文件进行修改后, 可以重登录, 或者新开一个bash, 或者使用source命令来使它们生效.

有时候可能记不清到底是哪些配置文件被读取, 可在上述的文件末尾添加一条echo语句, 显示它是否被调用. 然后打开一个terminal或者进入console看看, 就知道哪些配置文件被调用, 以及它们的调用顺序.

Lumerical官方案例、FDTD时域有限差分法仿真学习(十三)——多模干涉耦合器(MMI) 计算通过 1×2 端口多模干涉 (MMI) 耦合器的宽带传输和光损耗。 使用设备 S 参数在 INTERCONNECT 中创建 MMI 的紧凑模型。 它还展示了如何使用 CML 编译器提取这些参数以生成紧凑模型。 一、概述 了解模拟工作流程和关键结果 低损耗光合路器和分路器是基于 Mach-Zehnder 的光调制器的基本组件,并且是集成电路的关键组成部分。通过在输入/输出波导处使用线性锥形确保输入/输出波导的模式与干涉区域之间的 阅读详情

相关推荐

VirtualBox安装Win10虚拟机超详细教程(附微软官方镜像下载)

本文提供了一份详细的VirtualBox安装Win10虚拟机教程,涵盖从环境准备、工具下载到系统安装与初始配置的全过程。特别推荐使用微软官方镜像下载,确保系统纯净安全。此外,还分享了性能优化技巧和常见问题解决方案,帮助用户高效搭建稳定的Windows测试环境。

weixin_29243279的博客 920

Bash基础

BASH 一、 bash基础特性: 命令历史:history,读取内存中的命令历史。 (1) 环境变量:定制history特性。 HISTSIZE:命令历史记录的条数; HISTFILE:定义history命令历史的保存位置,默认为~/.bash_histroy。 HISTFILESIZE:命令历史文件记录历史的条数; HISTCONTROL:命令历史记录方式; a) ignoredups:忽略连续且相同的命令; b) ignorespace:忽略以空白字符开头的命令; c) ignoreboth:上

个人博客:busyops.com 1972

yolov8的Detect层详解(输出维度改动)

对于部署端需要拿到onnx的output进行后处理,但是基于anchor_free的yolov8输出是1*(4+cls)*8400,不是我们常见的ncwh格式,所以对Detect层进行了学习,分享一下体会。

yjcccccc的博客 2万+

bash基础

1、为什么要使用bash shell (1)bash能记录使用过的命令,这些命令记录在~/.bash_history中。~/.bash_history记录的是上一次用户登录时使用的命令,而本次登录的命令只会在内存中。 (2)Tab的命令补全功能,可以让你少打很多字,并保证输入正确。 (3)命令别名alias的功能,省略很多长指令。 (4)工作进程前后台切换。 (5)shell 脚本。

mrly 783

【项目实战】YOLOV5 +实时吸烟目标检测+手把手教学+开源全部

本原创项目长期更新,旨在完成校园异常行为实时精检测,做到集成+N次开发+优化(不止局限于调包)为止,近期将不断更新以下模型+数据+标注文件+教程。关注博主,Star 一下github,一起开始美妙的目标检测之路吧~~ 文章目录本原创项目长期更新,旨在完成校园异常行为实时精检测,做到集成+N次开发+优化(不止局限于调包)为止,近期将不断更新以下模型+数据+标注文件+教程。关注博主,Star 一下github,一起开始美妙的目标检测之路吧~~一、项目展示二、项目资源共享1:训练图片:香烟图片+吸烟手势+烟雾三、

cv君的博客 13万+

基于Xilinx K7-410T的高速DAC之AD9129开发笔记(一)

引言:从本文开始,我们介绍下项目中设计的并行LVDS高速DAC接口设计,包括DAC与FPGA硬件接口设计、软件设计等。项目设计高速DAC采用了ADI公司的AD9129,该芯片最大更新速率5.7Gsps,该芯片在宽带通信应用、LTE、雷达信号产生、干扰机等领域有广泛应用。

FPGA_Designer 2535

Bash 基础与进阶实践指南

这份笔记从 Bash 的基础概念和常用命令入手,涵盖权限管理、脚本编写、控制流、文本处理等核心知识点,并补充了数组、信号捕捉、定时任务等进阶用法,帮助初学者和有一定经验的用户全面掌握 Bash 的使用与脚本编程技巧。

i89211的博客 3281

ESD防护设计宝典(十一):CE(传导发射)超标问题排查与解决

(Conducted Emission, CE),亦称为传导骚扰,是电子电气设备或系统内部的电压、电流通过信号线、电源线或地线向外传输,对其他电子电气设备或系统造成电磁干扰的物理现象。其。

m0_56451176的博客 857

Linux基础(三)——Bash基础

Linux的Bash基本介绍,Bash命令使用功能,Bash基本特性

liuhuayeyu的博客 1971

GEE:大面积研究区域数据分块导出,以解决内存限制和导出失败的问题

本文介绍了在Google Earth Engine (GEE)平台分块导出大面积研究区域数据的方法。针对直接导出大区域影像易失败的问题,作者提出通过网格分块技术进行处理。文章展示了完整的JavaScript代码示例,包含定义研究区域、加载ESA WorldCover数据集、设置分块参数(包括像素大小、分块尺寸)、创建网格系统、处理坐标转换等关键步骤。代码中还提供了错误处理和导出按钮功能,确保数据能可靠地分块导出到Google Drive。该方法有效解决了大区域数据导出时的内存限制问题,适用于全球范围的研究。

养乐多的博客 1186

YOLOv8 改进:添加 LSK 注意力机制

通过添加 LSK 注意力机制,YOLOv8 能够更有效地捕捉特征图上的重要信息,提高检测性能,尤其是在复杂场景下展现出色的表现。这种方法不仅适用于资源受限的设备,还能在丰富多样的实际应用中提供强劲支持。

走向CTO的路上... 1222

Linux基础学习笔记之——BASH

BASH 1、环境变量 1.1、环境变量的功能 1.1.1、用 env 观察环境变量与常见环境变量说明 [root@li ~]# env XDG_SESSION_ID=1 HOSTNAME=li.erver #主机名 SELINUX_ROLE_REQUESTED= TERM=xterm #终端使用的环境 SHELL=/bin/bash #目前这个环境下,使用的 shell 是哪一个程序? HISTSIZE=1000 #默认可记录 1000 笔 SSH_CLIENT=10.0.0.100 56519

前尘忆梦的博客 2585

专转本-信息通信技术-笔记

专转本-信息通信技术-笔记

大今野 1366

bash学习笔记1-bash基础

shell是操作系统与用户之间最主要的接口。shell的任务就是解释用户输入的命令并执行,然后将结果返回给用户。 UNIX中主要有两大类shell:Bourne shell和C shell。Bourne shell(sh),Korn shell(ksh)和Bourne Again shell(bash)都是属于前一类,C shell(csh)和TENEX/TOPS shell(tcsh)属于后

1252

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Linux学习笔记8—BASH基础特性

使用type区分外部或内部命令,内部显示为builtin,外部显示为命令文件路径。命令可以有别名,别名可以与原名相同,此时原名被隐藏,此时如果要运营原命令,则使用\COMMAND。l:symbolic link,符号链接文件,类似windows的快捷方式,也称为软链接文件,有软链接与硬链接的区别。w命令:与who命令一致,不仅显示用户登录信息,还可以显示目前用户的操作内容,加强版who命令。s:socket,套接字文件,两个进程实现通信时的套接字文件,类似插座的功能。

jya18th的博客 117

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

Bash Cookbook 学习笔记 【基础】

Read Me 本文是以英文版<bash cookbook> 为基础整理的笔记,力求脱水 2017.11.23 更新完【基础】,内容涵盖bash语法等知识点。 本系列其他两篇,与之互为参考 【中级】内容包括工具、函数、中断及时间处理等进阶主题。传送门 【高级】内容涉及脚本安全、bash定制、参数设定等高阶内容。传送门...

weixin_34179968的博客 224

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

Bash脚本编程学习笔记02:脚本基础和bash配置文件

脚本基础 参考资料:Shell Scripts (Bash Reference Manual) 不严谨地说,编程语言根据代码运行的方式,可以分为两种方式: 编译运行:需要先将人类可识别的代码文件编译成机器可运行的二进制程序文件后,方可运行。例如C语言和Java语言。 解释运行:需要一个编程语言的解释器,运行时由解释器读取代码文件并运行。例如python语言(解释器:/usr/bin/python)和shell脚本(解释器:/bin/bash)。 根据其是否调...

cnmeimei的博客 575

Linux学习笔记:bash的基础特性

bash的基础特性 历史命令 history 环境变量: HISTSIZE:命令历史记录的条数 HISTFILE:~/.bash_history ISTFILESIZE:命令历史文件里路的条数 history -d OFFSET:在指定位置删除历史命令 history -c:清空历史命令 history #:显示历史中最近的#条命令 history -a:手动追加当前绘画缓冲区的命令历史至历史

Ivan45007的博客 582

Bash学习笔记:基础

The Bash shell is commonly used interactively: It lets you enter and edit commands, then executes them when youpress the Return key.The Bash shell can also be run non-interactively from a script, mak...

weixin_34007886的博客 155

Linux学习笔记11—BASH基础特性glob及IO重定向

练习5:复制/usr/share/man目录下,所有以man开头,后跟一个数字结尾的文件或目录至/tmp/man/目录下。练习6:复制/etc目录下,所有以.conf结尾,且以m,n,r,p开头的文件或目录至/tmp/conf.d/目录下。练习4:复制/etc目录下,所有以m开头,以非数字结尾的文件或目录至/tmp/magedu.com目录。练习1:显示/var/log目录所有以l开头,以一个小写字母结尾,且中间出现一位任意字符的文件或目录。输出的数据流:–>标准输出(stdout),通常输出至显示器。

jya18th的博客 330

马哥Linux学习笔记3-2bash基础特性及基础命令

bash的基础特性: 1、命令历史history 环境变量:HISTSIZE:命令历史记录的条数 HISTFILE:~/.bash_history HISTFILESIZE:命令历史文件记录历史的条数 history -d OFFSET 偏移量,即第几条 -c清空 history #:显示历史中最近的#条命令 -a:手动追加当前会话缓区去的命令历史至历史文件中。 调用历史中的命令: !...

心流时间的博客 238

Bash学习笔记-基础

特殊字符: ;     命令分割符.允许在同一行里有两个或更多的命令. .     当前目录       隐藏文件,文件名以 . 为前缀时,该文件变成了隐藏文件。ls -a才能显示 ,     逗号操作符用于连接一连串的数学表达式 `    斜引号  `command`命令替换 命令(command)执行结果能赋值给一个变量   :     空命令  空操作, 是Bash自身内...

fionajw的博客 141

Linux学习笔记9—BASH基础特性文件查看及管理

在给定的起始路径下,已对应路径下的打头字符串来逐一匹配起始路径下的每个文件,如果能唯一标识,则直接补全,如果不能唯一标识,则再单击tab键,给出列表。给定的打头字符串如果能唯一标识某命令程序文件,则直接补全,如果不能唯一标识某命令程序文件,再单击tab键,会给出列表。问题1:如何创建/tmp/x/y1, /tmp/x/y2, /tmp/x/y1/a, /tmp/x/y1/b。/tmp/{a,b} 相当于 /tmp/a , /tmp/b。~:自动展开为用户的家用户,或指定的用户的家目录。

jya18th的博客 307

linux bash tar,Linux 基础学习笔记(一 bash shell)

Linux(基于《Linux命令行与shell脚本编程大全》的学习笔记)4 更多的bash shellps 命令ps 命令支持三种不同类型的命令行参数Unix风格的参数,前面加单破折线BSD风格的参数,前面不加破折线GUN风格的长参数,前面加双破折线常用 ps -ef 即为显示所有进程-e,显示完整的格式输出-f,也可以在后面选择管道结束进程kill 命令可以结束进程,只支持通过进程号来结束进程...

weixin_28783097的博客 324

linux shell 入门学习笔记5 bash基础特性

【代码】linux shell 入门学习笔记5 bash基础特性。

qq_20252351的博客 141

Linux学习笔记(16)shell基础之Bash变量

1. 用户自定义变量 (1)变量设置规则 ① 变量名称可由字母、数字和下划线组成,但不能以数字开头; ② 变量的默认类型为字符串类型,如果要对数值运算,则必须指定变量类型为数值型; ③ 变量用等号连接值,且等号两侧不能有空格; ④ 变量的值如果有空格,需使用单引号或双引号括起; ⑤ 变量的值中,可使用"\"转义符; ⑥ 如果需要增加变量的值,可以进行变量值的叠加,不过变量需...

debang2014010的专栏 231
上一篇: Linux系统信息查看命令
下一篇: work log 20101127
mindva
博客等级 码龄19年 2粉丝 61原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值