Dskpimc? · 2023年05月30日 · 北京市

bash shell脚本常用代码记录

任何编程语言,常用的语法和代码结构其实不多的,如果为了快速的掌握入手一门编程语言,我认为只需要把该语言的常见语法和代码记下来,再结合实际需求去拼接成新的代码。这篇博客主要是记录bash shell的一些用法,便于日后复习。所以这篇博客不会一次性写完的,会不断更新新的例子进来。

shell不是具体哪一款程序,它是一类程序的统称,这些程序只要能够按照用户的要求去调用操作系统的接口,就可以称之为shell程序。常用shell程序有:bash, csh, tcsh, zsh等。

当我们在linux内打开一个terminal,此时就开启了一个shell程序供我们与操作系统进行交互。可以设置具体是开启了哪一款shell程序。

1. 列出当前linux系统安装的所有shell

在terminal内执行:cat /etc/shells,结果如下:

image.png

linux系统中当前安装的所有shell的列表存储在系统的/etc文件夹的"shells"文件中。默认情况下它具有只读权限,并且每当我们在系统中安装新shell时都会自动修改它。

2. 查看当前使用的shell

在terminal内执行:echo $SHELL,结果如下图:
image.png

3. 查看bash的手册

在terminal内执行:man bash

4. 定义变量和使用变量

变量名不需要声明,直接这样写:variable_name=variable_value。使用变量需要用$放在variable_name前就行,比如:


var="define variable"
echo $var

5. 注释

单行注释使用#号
多行注释可以通过在<< COMMENT和COMMENT之间加上注释

# echo $var
 
<< comment
export var
test comment
echo "somethin"
comment

6. Bash脚本第一行

Bash脚本文件的第一行必须是:#!/bin/bash。#!称为shebang,该行的其余部分是解释器的路径,用于指定bash shell在操作系统中的位置。

She Bang(#!)是一个字符序列,由脚本开头的符号(#)和感叹号(!)组成。在类似Unix的操作系统下,当带有shebang的脚本作为程序运行时,程序加载器会将第一行的其余行解析为解释器指令。因此,SheBang表示执行脚本行的解释器,并且它被称为执行各种脚本(如Bash,Python等)的路径指令。

shebang的格式很重要,格式不正确会导致命令工作不正常。因此,在创建脚本时,要始终记住SheBang格式的这两点:

  • 它应该始终在脚本的第一行。
  • 在#!和解释器的路径之间,#之前不应有任何空格。

7. 字符串和引号

Bash使用空格来确定单独的项目,引号可用于处理带有空格字符的文本。引号分为单引号和双引号。使用简单的文本和字符串时,使用单引号和双引号没任何区别。但如果需要对shell变量扩展,则只能使用双引号。如果在单引号中使用变量,则不会将其视为变量。例子如下:

Bash script:
var="define variable"
echo "The value is $var"
echo 'The value is $var'
 
The result is:
The value is define variable
The value is $var

8. Bash变量

变量名可以包含字母、数字和下划线,并且其名称只能以字母和下划线开头。不能定义以任何数字开头的变量。Bash变量不必在变量声明时定义变量的数据类型。Bash变量是无类型的,只需通过分配其值来键入变量名称,它会自动判断数据类型。如果将数字值分配给变量,它将自动转为整数工作,如果将字符值分配给该变量,则它将转为字符串类型。

  • 在读取或打印变量时,需要在变量名前加上美元($)符号;
  • 给变量赋值时,省略美元符号($);且变量名称和值之间的等号(=)两侧不应有空格。
  • 变量名称区分大小写:x和X视为两个不同的变量;
  • 变量可以放在Bash脚本中的任何地方或命令行中,因为在运行时,Bash会将其替换为其分配的值;
  • 不需要使用任何单引号或双引号来定义具有单个字符串的变量。需要将多个单词或字符串作为单个项输入到变量中,需要使用引号。

例子如下:

The bash script:
var="define variable"
echo "The value is $var"
var=123456
echo "The value is $var"
var=variable
echo "The value is $var"
 
The result is:
The value is define variable
The value is 123456
The value is variable

9. 系统变量和用户自定义变量

Shell或UNIX系统中都有两种类型的变量:系统定义的变量和用户定义的变量。

系统定义的变量是由操作系统本身创建和维护的预定义变量,通常是以大写字母进行定义的。要了解系统中有哪些系统变量的列表,在命令行或脚本中输入命令:set,或env,或printenv。例子如下:

The bash script:
echo $BASH
echo $BASH_VERSION
echo $OSTYPE
 
The result is:
/bin/bash
4.2.46(2)-release
linux

用户定义的变量是由用户创建和维护,通常这些变量以小写形式定义,但不强制,也可以定义成大写的。第8点已经讲过如何定义变量了,这里不说了。

10. 命令行参数

使用命令行参数可以给Bash脚本传递参数使脚本更具灵活性。在脚本运行时,以空格见间隔,跟在脚本名称后面。在Bash中,以下特殊变量会记录传递的参数:

  • $0 - 指定要调用的脚本的名称;
  • $1-$9 - 存储前9个自变量的名称,或可用作自变量的位置;
  • $# - 指定传递给脚本的参数总数(计数);
  • $* - 通过将所有命令行参数连接在一起来存储它们;
  • $@ - 将参数列表存储为数组;
  • $? - 指定当前脚本的进程ID;
  • $$ - 指定最后一个命令或最近执行过程的退出状态;
  • $! - 显示最后一个后台作业的ID;

例子如下:

The script is:
echo 'echo $0 is' $0
echo 'echo $1 is' $1
echo 'echo $2 is' $2
echo 'echo $3 is' $3
echo 'echo $4 is' $4
echo 'echo $5 is' $5
echo 'echo $6 is' $6
echo 'echo $# is' $#
echo 'echo $* is' $*
echo 'echo $@ is' $@
echo 'echo $? is' $?
echo 'echo $$ is' $$
echo 'echo $! is' $!
 
Run script: >>./test_bash.sh this is the first script
 
The result is:
echo $0 is ./test_bash.sh
echo $1 is this
echo $2 is is
echo $3 is the
echo $4 is first
echo $5 is script
echo $6 is
echo $# is 5
echo $* is this is the first script
echo $@ is this is the first script
echo $? is 0
echo $$ is 621356
echo $! is

在$@数组里的参数可以传递给其它数组并引用。

args=("$@")  
echo ${args[0]} ${args[1]} ${args[2]} ${args[3]}
 
The result is:
this is the first

11. 命令替换

命令替换允许命令的输出替换命令本身。Bash通过在子shell环境中执行命令并用命令的标准输出替换命令,并删除任何尾随的换行符。常用的命令替换语法为:

语法1:将要替换的命令放在反引号里
variable_name=`command_name`  
variable_name=`command_name [option...] argument1 argument2...`  
语法2:将要替换的命令放在圆括号里,且以美元符号($)开头
variable_name=$(command_name)  
variable_name=$(command_name [option...] argument1 argument2...)

文章知识点与官方知识档案匹配,可进一步学习相关知识
CS入门技能树Linux入门初识Linux31591 人正在系统学习中

作者:谷公子
文章来源:CSDN

推荐阅读

Questasim设置仿真随机种子(random seed)
一颗芯片的自述:从立项、流片、验证到发布管理的心路历程!
原型验证过程中的ASIC到FPGA的代码转换

更多IC设计请关注IC设计技术专栏。欢迎添加极术小姐姐微信(id:aijishu20)加入技术交流群,请备注研究方向。
推荐阅读
关注数
19637
内容数
1303
主要交流IC以及SoC设计流程相关的技术和知识
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息