Bash基础(一)_码农爱学习的博客-程序员秘密

技术标签: shell  linux  Linux知识库  bash  

介绍Bash之前首先介绍Shell,shell是一个程序,可以称之为壳程序,用于用户与操作系统进行交互。用来区别与核,相当于是一个命令解析器,Shell有很多中,这里列出其中几种 :

  • Bourne SHell(sh)
  • Bourne Again SHell(bash)
  • C SHell(csh)
  • KornSHell(ksh)
  • zsh

各个shell的功能都差不太多,在某些语法的下达下面有些区别,Linux预设就是bash。

简单点说,直接把shell和bash先理解为一个东西好了,就是Linux中的那个终端窗口(Terminal),也就是那个小黑框,下面的例子都是在Linux的终端窗口中运行的。

变量

变量赋值

  1. 基本形式为变量=变量值,注意等号左右不能有空格,变量均为文本形式,如;
var1=World
  1. 对于有空格的变量值,用单引号或双引号包围,如:
var2='abc bcd'
  1. 可以将某个命令输出的文本直接赋予某个变量,命令需要反引号包围,如:
var3=`date`
  1. 变量之间可以赋值,需要使用**$符号**说明是变量,如:
var4=$var1
  1. 可以使用**read关键字**接收数据至某个变量,如:
read name

变量引用

变量引用是指将变量翻译为变量中存储的文本,基本形式为$变量

  1. 通过echo命令显示变量,如:
echo $var3
2019年 11月 10日 星期日 19:12:55 CST
  1. 通过echo显示时,可以直接与附加文本相连,如:
echo Hello$var1
HelloWorld
  1. 当附加文本尾随变量名造成歧义时,添加大括号,如;
echo ${var4}IsGood
WorldIsGood
  1. 可以在双引号内使用变量,但在单引号内只能被当作文本,如:
echo "Hello $var1"
Hello World
echo 'Hello $var1'
Hello $var1

数学运算

  1. 在bash中,数字和运算符均被当作文本,数学运算需借助双大括号$(())
result=$((1+2))
echo $result
3
  1. 支持的运算符有:加+、减-,乘*,除/,求余%,乘方**,其中乘方的优先级最高,示例:
echo $((2+5*2**(5-3)/2))

返回代码

  1. 在Linux中,每个可执行程序运行完后会有一个整数的返回值,可以使用**$?变量**来接收,对于简单的foo.c程序:
int main(void)
{
    
    int a=1;
    
    return 0;
}

使用gcc编译器编译,并执行:

gcc foo.c
./a.out
echo $?
0
  1. 如果程序运行异常,将返回非0值,如删除一个不存在的文件:
rm none_exist.file
rm: cannot remove 'none_exist.file': No such file or directory
echo $?
1
  1. 在执行多条指令时,可以让后一个程序的运行参考前一个程序的返回代码,如:

首先新建一个文件并查看确认:

touch demo.file; ls

成功删除的情况,使用**&&符号**连接:

rm demo.file && echo "rm succeed"
rm succeed

不成功删除的情况,使用**||符号**连接:

rm demo.file || echo "rm failed"
rm: cannot remove 'demo.file': No such file or directory
rm failed

bash脚本

脚本示例

使用vim编辑器编辑test.sh文件,内容如下:

#!/bin/bash

echo "Information of xxpcb's computer:" > log

# 显示CPU相关信息
echo "------lscpu---------------------" >> log
lscpu >> log

# 显示Linux系统详情(unix name)
echo "------uname -a------------------" >> log
uname -a >> log

# 显示内存使用情况
echo "------free -h-------------------" >> log
free -h >> log

该文件的作用是将一些计算机信息保存到所在目录的log文件中。

使用sh test.sh执行bash脚本。

使用cat log命令查看log文件信息:

Information of xxpcb's computer:
------lscpu---------------------
Architecture:        x86_64
CPU op-mode(s):      32-bit, 64-bit
Byte Order:          Little Endian
CPU(s):              4
On-line CPU(s) list: 0-3
Thread(s) per core:  1
Core(s) per socket:  4
Socket(s):           1
NUMA node(s):        1
Vendor ID:           GenuineIntel
CPU family:          6
Model:               60
Model name:          Intel(R) Core(TM) i5-4590 CPU @ 3.30GHz
Stepping:            3
CPU MHz:             1512.460
CPU max MHz:         3700.0000
CPU min MHz:         800.0000
BogoMIPS:            6596.30
Virtualization:      VT-x
L1d cache:           32K
L1i cache:           32K
L2 cache:            256K
L3 cache:            6144K
NUMA node0 CPU(s):   0-3
Flags:               fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm cpuid_fault epb invpcid_single pti ssbd ibrs ibpb stibp tpr_shadow vnmi flexpriority ept vpid ept_ad fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid xsaveopt dtherm ida arat pln pts md_clear flush_l1d
------uname -a------------------
Linux deeplearning 5.0.0-29-generic #31~18.04.1-Ubuntu SMP Thu Sep 12 18:29:21 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux
------free -h-------------------
              total        used        free      shared  buff/cache   available
Mem:            15G        939M         12G         29M        2.2G         14G
Swap:           11G          0B         11G

可以看出CPU型号:i5-4590 CPU,Linux版本:Ubuntu18.04,内存容量:15G。

脚本参数

  1. bash脚本在运行时,也可以携带参数,在脚本中通过变量的形式接收,如test_arg.sh内容如下:
#!/bin/bash

echo $0
echo $1
echo $2

其中$0是命令的第一部分,$1才是第一个参数,如运行:

./test_arg.sh hello world
./test_arg.sh
hello
world
  1. 利用传入的参数可以令脚本的使用更加灵活,对于上面的test.sh文件,可以使用参数指定保存的文件:
#!/bin/bash

echo "Information of xxpcb's computer:" > $1

# 显示CPU相关信息
echo "------lscpu---------------------" >> $1
lscpu >> $1

# 显示Linux系统详情(unix name)
echo "------uname -a------------------" >> $1
uname -a >> $1

# 显示内存使用情况
echo "------free -h-------------------" >> $1
free -h >> $1

在执行时,可以指定将信息输出到output.file文件:

sh test.sh output.file

脚本的返回值

与可执行程序类似,脚本也可以有返回值,按照惯例正常情况返回0,在脚本末尾使用exit命令设置返回值,如hello_world.sh:

#!/bin/bash

echo Hello
echo World
exit 0

注意,末尾手动添加exit 0并不必要,脚本正常运行其实会自动返回代码0。执行示例:

sh hello_world.sh
Hello
World
echo $?
0

注意,如果在脚本中间出现exit,则脚本提前退出,并返回该exit命令给出的代码值。

函数

脚本中也可以使用类似函数的结构,并且同样可以使用传入的参数:

#!/bin/bash

# 定义函数my_info
function my_info()
{
    
    lscpu >> $1
    uname -a >> $1
    free -h >> $1
}

# 函数调用
my_info output.file

注意:函数定义时,关键字function和大括号{}为函数提示,因而可以省略function关键字。

跨脚本调用

使用source命令可以实现函数的跨脚本调用。source命令的作用是在同一个进程中执行另一个文件中的bash脚本。

例如有my_info.sh(内容如上)和app.sh:

#!/bin/bash

source my_info.sh
my_info output.file

运行app.h,执行到source命令所在行时,就会执行my_info.sh脚本。因此在app.h中使用my_info函数。

注:

/bin/sh/bin/bash的细微区别(参考:https://www.cnblogs.com/givemelove/p/8477430.html)

在shell脚本的开头往往有一句话来定义使用哪种sh解释器来解释脚本。
目前研发送测的shell脚本中主要有以下两种方式:

  • #!/bin/sh

  • #!/bin/bash

    值得注意的是:

  • sh一般设成bash的软链

  • 在一般的linux系统当中(如redhat),使用sh调用执行脚本相当于打开了bash的POSIX标准模

  • 也就是说 /bin/sh 相当于 /bin/bash --posix

所以,sh跟bash的区别,实际上就是bash有没有开启posix模式的区别

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/hbsyaaa/article/details/106322841

智能推荐

python打印九九乘法口诀_python以不同方式打印输出九九乘法表_weixin_39951112的博客-程序员秘密

参考:http://www.cnblogs.com/suiy-160428/p/5594389.htmlpython输出 9*9 乘法口诀表矩形输出九九乘法表:for i in range(1,10):for j in range(1,10):if i

【LEDE】树莓派上玩LEDE终极指南-65-OpenWrt18.06.1挂bt挂死的解决方案_树莓pi4 lede_小学生414的博客-程序员秘密

最近升级了OpenWrt tag18.06.1,发现增加了许多新功能,一直没时间去研究怎么用。在挂迅雷下载ED2K的时候,偶然发现wifi会慢慢的挂掉,直到新的客户端连接不上,旧的客户端没网速。随便看了下,取消了这个勾选:原因日后分析吧。。。     20181009更新还有一种可能性,对应另一种解决方式:加密模式选择“混合”...

zookeeper入门系列-概述_zookeeper入门教程_liweisnake的博客-程序员秘密

zookeeper可谓是目前使用最广泛的分布式组件了。其功能和职责单一,但却非常重要。在现今这个年代,介绍zookeeper的书和文章可谓多如牛毛,本人不才,试图通过自己的理解来介绍zookeeper,希望通过一个初学者的视角来学习zookeeper,以期让人更加深入和平稳的理解zookeeper。其中参考了不少教程和书,相关书目列在文末,也感谢这些作者。学习新的框架,先让我们搞清楚他是什...

面向对象与面向过程最简单的理解_学习不止的博客-程序员秘密

面向对象:苹果->吃 面向过程:吃(苹果)

安装 miniconda + opencv_miniconda opencv_freddiezhu的博客-程序员秘密

1、在中科大源下载miniconda3http://mirrors.ustc.edu.cn/anaconda/miniconda/2、提权chmod +x Miniconda3-4.5.11-Linux-x86_64.sh3、运行安装./Miniconda3-4.5.11-Linux-x86_64.sh#terminal一下就装好了,完了之后自动跳出这么个东西,等他加载完了.4.给...

Masonry自适应tableHeaderView、tableFooterView_masonry tableheader_Zeus_xuan的博客-程序员秘密

使用Masonry设置tableview自定义头视图、脚视图、区头尾视图Masonry设置头视图HeaderView *headerView = [HeaderView new];tableView.tableHeaderView = tableView;[tableView mas_makeConstraints:^(MASConstraintMaker *make) { make.width.mas_equalTo(self.view);}];// 必须设置[headerV

随便推点

记录一些遇到的报错问题_xct_xct的博客-程序员秘密

1、The connection property ‘zeroDateTimeBehavior’ acceptable values are: ‘CONVERT_TO_NULL’, ‘EXCEPTION’ or ‘ROUND’. The value ‘convertToNull’ is not acceptable解决:mysql数据库驱动依赖版本问题,换一个稍低版本2、Integer类型的字段如果传的是0,mybatis框架在mapper.xml文件中会解析成空串,这类字段在条件判断时要注意3、In

龙芯通过指令系统二进制翻译运行视窗系统(windows)_ciji4412的博客-程序员秘密

文章转帖自《电子发烧友》网站。   发展以CPU 和操作系统为核心的自主软硬件已经成为中国的国家战略。 经过自“十五” 以来的十余年努力, 以“龙芯”、“飞腾”、“申威” 为代表的中国自主CPU 研发取得了长足的进展, 部分设计技术达到了世界先进水平, 并在实际应用方面取得了若干突破, 出现...

如何通过mybatis返回oracle自增长id_oracle mybatis 自增id_凡夫贩夫的博客-程序员秘密

大家都知道像mysql,serveSql这样的数据库都提供有自增id的功能,而像oracle这样的数据库采取的是序列的方式来实现自增主键的,所以如果通过mybatis插入一条数据后返回主键id的方式也是不同的,网上有很多种说法,大都没说太明白,下面举个例子,详细说明一下,避免再入坑建表语句CREATE TABLE sys_student(id int P...

Processing基本函数整理_processing函数_AkaeSong的博客-程序员秘密

size(x, y); //画布尺寸设置 point(x,y); //定点绘制 line(x1,y1, x2, x2); //直线绘制,首先需要设定画布尺寸 rectMode(CENTER); //中心模式绘制矩形,不指定默认为CORNER,共有CORNER、CENTER及CORNERS三种模式 rect(x1, y1, x2, y2); //绘制矩形,参数的意义以模式定,具

数据可视化清新版【chart.js】学习笔记3.0—折线图(Line)_chartjs line_LIMI_伞梦的博客-程序员秘密

line——(折线图/曲线图)折线图是在一条线上绘制数据点的方法。通常,它用于显示趋势数据或两个数据集的比较。官方文档https://www.chartjs.org/docs/latest/charts/line.html用法示例var myLineChart = new Chart(ctx, {type: ‘line’,data: data,options: options});数据集属性(博主这边只列举看出了比较常用和设置影响明显的属性)属性描述类型默认值

推荐文章

热门文章

相关标签