Linux里面Bash的使用方法_bash命令用法_zhuizong8的博客-程序员秘密

技术标签: linux  bash  开发语言  

[email protected]

Shell

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

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

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

bash

bash命令是sh命令的超集,大多数sh脚本都可以在bash下运行,bash主要有如下这些功能

bash功能

记录历史命令:bash可以记录曾经的命令,保持在~/.bash_history文件中,只保存上次注销登录之后的命令
tab键自动补全:使用tab见可以自动不全命令或者目录i
alias命令别名:可以使用alias ll='ls -al'来设置命令的别名
工作控制:可以将某些任务放在后台去运行,这里不多种介绍
程序脚本:可以执行shell脚本文件
通配符:在查找相关文件或者执行相关命令时,可以使用通配符*
内建命令type:可以使用type 命令来查看某个命令是否为内建在bash当中的命令

实验十一:Bash 的使用-第一部分 

1.实验目的 

1)掌握 Bash 命令处理器的使用 

2.实验内容 

1.编写并执行第一个 Bash 脚本 
2.Bash 变量 
3.Bash 字符串 
4.Bash 数组 
5.Bash 注释 
6.Bash 传递参数 

3.实验环境 

树莓派 4B,系统为 Ubuntu 21.10 系统 。实验的编程环境为 Terminal 终端程序

4.实验步骤 

1.编写并执行第一个 Bash 脚本 

打开终端,通过 vim 命令来创建文件,新建一个文件 test.sh,扩展名为 sh(sh 代表 shell),扩展名并不会影响脚本的执行,如果使用 python 来写 shell 脚 本,扩展名使用 py 就好了。

在 vim 编辑器中输入下面的代码:

接下来就是运行这个 Bash 脚本

我们可以直接运行解释器,其参数就是 shell 脚本的文件名,如: 
$ /bin/sh test.sh 或者 $ bash test.sh 

结果如下:

 2.Bash 变量 

bash中变量有两种,分别是环境变量和自定义变量,可以理解为全局变量和局部变量,在理解他们的区别前,需要知道父程序和子程序,举个例子,当前的bash我们称之为父程序,而在这个bash下执行的任何程序,都称之为子程序。那全局变量和局部变量的区别就是,全局变量在子程序中仍然有效,局部变量只在当前程序中生效。(注意,一旦退出父程序这个bash的话,无论是全局变量还是局部变量都失效了,再次打开bash时,该变量是不存在的)

3.Bash 字符串 

字符串是 Bash 编程中最常用最有用的数据类型,字符串可以用单引号,也可以 用双引号,也可以不用引号。 
单引号声明字符串 

str='string' 

单引号声明字符串的一些限制: 
• 单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的; 
• 单引号字串中不能出现单独一个的单引号(对单引号使用转义符后也不 行),但可成对出现,作为字符串拼接使用。 

 双引号声明字符串 


 
输出结果为: 


 
双引号的优点: 
• 双引号里可以有变量 
• 双引号里可以出现转义字符 

4.Bash数组

有2种数组:

  • 索引数组
  • 关联数组(java里的Hashmap),用key关联value

声明数组:

#声明索引数组
declare -a ary
#声明关联数组
declare -a ary

引用数组:${ary[idx]}

必须加大括号

直接访问数组名,就是访问第一个元素

[[email protected] ~]# ani[0]=dog
[[email protected] ~]# ani[1]=cat
[[email protected] ~]# echo ani
ani
[[email protected] ~]# echo ani[0]
ani[0]
[[email protected] ~]# echo $ani[0]
dog[0]
[[email protected] ~]# echo ${ani[0]}
dog
[[email protected] ~]# echo ${ani[1]}
cat

给数组赋值

5.Bash 注释 

以 # 开头的行就是注释,会被解释器忽略。 
通过每一行加一个 # 号设置多行注释,像这样:  

如果在开发过程中,遇到大段的代码需要临时注释起来,过一会儿又取消注释,怎么办呢? 
每一行加个#符号太费力了,可以把这一段要注释的代码用一对花括号括起来, 定义成一个函数,没有地方调用这个函数,这块代码就不会执行,达到了和注释一样的效果 。

6.Bash 传递参数 

 比如我要输出一个基因在染色体上的位置信息,可以写如下bash脚本,保存为gene.sh

脚本中保存了基因的位置信息。

#!/bin/bash

START=5000000
END=6000000
SCFID=785
GENE=Cyp6a9

echo The ${GENE} is on Chr${SCFID}:${START}-${END} 

然后在命令行执行即可。

chmod 777 gene.sh
./gene.sh
## The Cyp6a9 is on Chr785:5000000-6000000

不过,如果脚本并不是只执行一次,而是很多次。那么每次针对不同的基因,都要进入gene.sh文件,然后针对4个参数进行修改,然后保存文件。很不方便,也不适合批量操作。

这个时候就需要给脚本加上参数了,这样,每次在执行脚本的时候在命令行输入参数即可,不需要再进入脚本文件进行修改。

位置参数

通过在命令行的位置,来表示传入对应脚本的参数。这是最简单的一种,如下我们将4个参数对应START,END,SCFID和GENE进行传入参数。

#!/bin/bash

START=${1}
END=${2}
SCFID=${3}
GENE=${4}

echo The ${GENE} is on Chr${SCFID}:${START}-${END} 

这时在执行的时候,只需在命令行输入对应参数即可,参数之间使用空格分割。

./gene.sh 5000000 6000000 785 Cyp6a9
## The Cyp6a9 is on Chr785:5000000-6000000

这种方法虽然简单,但是输入参数的时候必须严格对应,不能空缺参数,不能颠倒位置,这对脚本的新用户是十分不友好的。

参数名匹配

另一种传递参数的方式就是使用关键词,通过关键词匹配进行参数传递,这种情况下的参数传入方式就比较灵活了,不依赖于参数位置。

#!/bin/bash
usage() {
  echo "Usage: ${0} [-s|--start] [-e|--end] [-i|--scfid] [-g|--gene]" 1>&2
  exit 1 
}
while [[ $# -gt 0 ]];do
  key=${1}
  case ${key} in
    -s|--start)
      START=${2}
      shift 2
      ;;
    -e|--end)
      END=${2}
      shift 2
      ;;
    -i|--scfid)
      SCFID=${2}
      shift 2
      ;;
    -g|--gene)
      GENE=${2}
      shift 2
      ;;
    *)
      usage
      shift
      ;;
  esac
done
    
echo The ${GENE} is on Chr${SCFID}:${START}-${END}

这时在命令行,可以不按照顺序输入参数,也可以使用双横线和全称的方式输入:

./gene.sh -s 5000000 -e 6000000  -i 785 -g Cyp6a2 
./gene.sh -e 6000000  -i 785 -g Cyp6a2 -s 5000000
./gene.sh  -e 6000000  -i 785 --gene Cyp6a2 -s 5000000
# .....

当然,如果命令参数没有找到匹配,会提示错误:

./gene.sh dsafda
## Usage: ./gene.sh [-s|--start] [-e|--end] [-i|--scfid] [-g|--gene]

这种参数传入的方式有两个关键,一个是使用case语句,另一个是使用了shift。shift的作用主要是移动位置参数。每执行一次都讲第一个位置参数向右移动一次。当然,如果是shift n就是每执行一次,向右移动n个位置。

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

智能推荐

数据库的高可用_数据库高可用_一元十二會_的博客-程序员秘密

关于数据库的高可用一、什么是高可用高可用HA(High Availability)是分布式系统架构设计中必须考虑的因素之一,它通常是指,通过设计减少系统不能提供服务的时间。假设系统一直能够提供服务,我们说系统的可用性是100%。如果系统每运行100个时间单位,会有1个时间单位无法提供服务,我们说系统的可用性是99%。很多公司的高可用目标是4个9,也就是99.99%,这就意味着,系统的年停机时间为8.76个小时。百度的搜索首页,是业内公认高可用保障非常出色的系统,甚至人们会通过www.

看懂UML类图和时序图_类方法时序图_五角钱的程序员的博客-程序员秘密

文章目录从一个示例开始类之间的关系1.泛化关系(generalization)2.实现关系(realize)3.聚合关系(aggregation)4.组合关系(composition)5.关联关系(association)6.依赖关系(dependency)时序图        这里不会将UML的各种元素都提到,我只...

ADB协议解析说明_adb 协议_程序课代表的博客-程序员秘密

系统标识字符串应该是"::",其中systemtype是"bootloader", "device",或"host", serialno一般是唯一ID或空值,banner是人类可识别的版本或标识符字符串,一般是有意义的属性。目前有两种运输方式:—USB传输,物理设备通过USB传输—本地传输,对于运行在主机上的模拟器,通过TCP连接到服务器理论上,应该可以编写代理的本地传输ADB服务器与连接到另一台机器/运行在另一台机器上的设备/模拟器之间的连接。

C++11新特性学习1_蜗牛love天空的博客-程序员秘密

学习网站C语言中文网:C++11教程:C++11新特性大汇总详细特性,请参考学习网站。

数据库关系建模(ER图设计关系表)_数据库设计er图_Andy_shenzl的博客-程序员秘密

目录一、概述二、基本概念1. 关系(relation)2. 列(column)3. 行(row)4. 关系表 VS 一般的表5. 主码(主键primary key)6. 实体完整性约束(entity integrity constraint)7. 外码(外键foreign key)8. 参照完整性约束(reference integrity c...

随便推点

[Unity]T4M升级unity2018以及笔刷纹理的融合问题_unity t4m 高版本问题_stalice的博客-程序员秘密

T4M升级至unity2018,遇到的问题是ProceduralMaterial被untiy2018废弃了,跟美术沟通后注释掉了ProceduralMaterial相关功能。之后美术发现用笔刷刷纹理会有一条黑边。仔细刨了发现,T4M的shader前面用到4张纹理进行融合,融合的比例分别是第5张纹理的RGB值,最后一张比例是1-RGB。笔刷刷的就是第5张纹理的RGB值。黑边的地方,只用前...

SharePoint 2013 添加Ribbon菜单_NetSuite - 张老师的博客-程序员秘密

前言:今天,我们尝试一下添加SharePoint2013的Ribbon菜单,这个Ribbon菜单是由XML定义,JavaScript脚本来实现的,基本类似为:Feature添加的功能。下面,让我们看看它的实现过程吧:1、新建空项目,用来添加我们的Ribbon,如下图;2、指定调试站点和安全级别,我选择场的解决方案,有需要可以试试沙盒,如下图;3、添加一个空元

WinRar 去弹窗_LemonShy在搬砖的博客-程序员秘密

1. 下载安装Winrar下载链接WinRAR archiver, a powerful tool to process RAR and ZIP files (rarlab.com)选择中文简体64位下载 包PS:Chinese(Simplified)和Chinese(Traditional) 分别为简体 和 繁体然后正常安装Winrar即可2. 下载安装Hacker下载网址Resource Hacker (angusj.com)下载、安装3. 破解WinRAR3.1 Hacker去除

tp6 workman 微信小程序 实现聊天室功能_昊屾的博客-程序员秘密

2020年7月3日tp6 workman 微信小程序 实现聊天室功能相关连接workman 官方文档thinkphp6 官方文档微信 开发文档js websocket: https://www.runoob.com/html/html5-websocket.html安装使用composer进行安装在命令台中执行 composer require topthink/think-worker配置默认找到config文件夹中worker_server.php 可以直接使用return 中的

【算法概论】贪心算法:区间划分问题_区间划分算法_t11383的博客-程序员秘密

区间划分问题Interval Partitioning问题描述: Lecture j starts at sj and finishes at fj Goal:find minimum number of classrooms to schedule all lectures so that no two occur at the same time in th...

Git 丢弃所有本地修改的方法_HeatDeath的博客-程序员秘密

本地修改了许多文件,其中有些是新增的,因为开发需要这些都不要了,想要丢弃掉,可以使用如下命令:git checkout . #本地所有修改的。没有的提交的,都返回到原来的状态git stash #把所有没有提交的修改暂存到stash里面。可用git stash pop回复。git reset --hard HASH #返回到某个节点,不保留修改。git reset --soft HASH...

推荐文章

热门文章

相关标签