Linux里面Bash的使用方法_bash命令用法-程序员宅基地

技术标签: linux  bash  开发语言  

2021SC@SDUSC

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]}

必须加大括号

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

[root@localhost ~]# ani[0]=dog
[root@localhost ~]# ani[1]=cat
[root@localhost ~]# echo ani
ani
[root@localhost ~]# echo ani[0]
ani[0]
[root@localhost ~]# echo $ani[0]
dog[0]
[root@localhost ~]# echo ${ani[0]}
dog
[root@localhost ~]# echo ${ani[1]}
cat

给数组赋值

  • 单个赋值:ary[idx]=val

  • 多个赋值:ary=(val1 val2...)

    [root@localhost ~]# ary=(1 2 3 4 )
    [root@localhost ~]# echo $ary
    1
    [root@localhost ~]# echo ${ary[0]}
    1
    [root@localhost ~]# echo ${ary[2]}
    3
    [root@localhost ~]# echo ${ary[1]}
    2
    [root@localhost ~]# echo ${ary[3]}
    4
    [root@localhost ~]# echo ${ary[4]}
    
    [root@localhost ~]#
    
  • 跳跃赋值:ary=([0]="aa" [3]="dd")

    [root@localhost ~]# ary=([0]="aa" [3]="dd")
    [root@localhost ~]# echo ${ary[0]}
    aa
    [root@localhost ~]# echo ${ary[1]}
    
    [root@localhost ~]# echo ${ary[3]}
    dd

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

智能推荐

【matlab】求空间两个向量之间的夹角_matlab 向量夹角-程序员宅基地

文章浏览阅读3.1w次,点赞28次,收藏73次。原点O[0,0,0]OA=[1,1,0];OB=[1,0,0];sigma = acos(dot(OA,OB)/(norm(OA)norm(OB)));%弧度制sigma/pi180%换算成角度_matlab 向量夹角

论文阅读笔记——野外和非侵入性遗传方法评估棕熊种群规模_棕熊 微卫星标记-程序员宅基地

文章浏览阅读497次。论文阅读笔记论文简介标题期刊情况论文内容摘要介绍论文简介标题英文:《An evaluation of field and non-invasive genetic methodsto estimate brown bear (Ursus arctos) population size》翻译:《野外和非侵入性遗传方法评估棕熊种群规模》期刊情况期刊:《Biological Conservation》期刊情况:2020年影响因子:4.711JCR分区 / 中科院分区:Q1 / 2区审_棕熊 微卫星标记

如何将手机变成一个(Linux)服务器_手机改服务器-程序员宅基地

文章浏览阅读2.2w次,点赞16次,收藏103次。看到就是赚到_手机改服务器

java double转String,去掉科学计数法_数值类型转成字符串后,不要用科学计数法-程序员宅基地

文章浏览阅读1.8k次。在数值型double转String格式时,如果同时遇到数值较大的double和小数位较多的double处理方法:double a = 123456789.10001;double b = 1.987654321;System.out.println("a: " + a);System.out.println("b: " + b);java.text.NumberFormat NF = java.text.NumberFormat.getInstance();//设置数值的小数部分所允许的最大._数值类型转成字符串后,不要用科学计数法

Fiddler抓包—手机app抓包_fiddler 移动端 app抓包-程序员宅基地

文章浏览阅读1.3k次。Fiddler抓包工作原理正常情况下,手机app是直接向服务器请求数据的,如果通过Fiddler抓包那么需要通过Fiddler,再向服务器请求数据。当app数据传到Fiddler,那么可以将请求的数据进行修改。比如app请求"123456",那么Fiddler可以将这一串数字改成"1",再发给服务器。此时服务器接收到的数据就是"1"。服务器返回数据到app和请求数据是一样的道理。Fid..._fiddler 移动端 app抓包

【200326】R语言read.table的用法以及报错line 6 did not have 15 elements 读取的项目数必需是列数的倍数-程序员宅基地

文章浏览阅读1.9w次,点赞10次,收藏32次。以2020美赛C题数据为例data <- read.table("D:\\mm\\Problem_C_Data\\hair_dryer.tsv" ,header = T, sep ="\t",dec = ".",quote="",comment.char = "",na.strings = c("NA"),fill=T)因为是tsv:Tab-separated values即制表符..._读取的项目数必需是列数的倍数

随便推点

基于SegNet和UNet的遥感图像分割代码解读_unet遥感图像分割-程序员宅基地

文章浏览阅读5.6k次,点赞9次,收藏104次。基于SegNet和UNet的遥感图像分割代码解读目录基于SegNet和UNet的遥感图像分割代码解读前言概述代码框架代码细节分析划分数据集gen_dataset.pyUNet模型训练unet_train.py模型融合combind.pyUNet模型预测unet_predict.py分类结果集成ensemble.pySegNet模型训练segnet_train.py前言上了一学期的课,趁着寒假有时间,看了往年论文和部分比赛的代码,现在整理出来。整理的这部分内容以实际操作为主,主要讲解代码部分的分析。概_unet遥感图像分割

Vue组件开发——异步组件_vue2 defineasynccomponent-程序员宅基地

文章浏览阅读566次。一、引入我们在讲异步组件之前,我们再来回顾一下webpack打包时的分包操作。我们可以使用import()异步加载模块来实现分包操作。import函数的返回值是一个Promise,所以我们可以使用then进行下一步处理。如下图所示为打包后的文件目录,因为我们如果同步加载math.js文件,此时就不存在中间的文件,此时当浏览器请求资源时,就会很慢。二、vue中的异步组件通过上面的webpack配置我们明白了为什么要进行分包操作,此时我们想一个问题,如果一个网站的页面在用户第一次浏览器时就将全部页面_vue2 defineasynccomponent

解决ToolBox升级IDEA后导致之前配置的插件消失问题(附:IDEA2020版本前后配置文件地址)【修理篇】_toolbox 下载的ide没有copy之前的插件进来-程序员宅基地

文章浏览阅读2.5k次。【修理篇】ToolBox升级IDEA后之前配置的插件消失问题(附:IDEA2020版本前后配置文件地址)    在IDEA的插件配置地址都是可配置的,通过修改idea.properties可指定插件和logs的地址等这个配置文件地址在IDEA2020.1版本后出现了一些变化。如下:2020.1版本之前:配置文件地址在IDEA安装目录的bin目录下。2020.1版本之后:在此版本之后有两种方法。1.从C盘\User\Administrator里开始找AppData\Roaming\JetBra_toolbox 下载的ide没有copy之前的插件进来

File Monitor on WinRT-程序员宅基地

文章浏览阅读48次。http://lunarfrog.com/blog/filesystem-change-notifications Use CreateFileQueryWithOptions to add file monitor(win32 use file watcher).* By default it FolderDepth is Shallow(root folder only), D..._file monitor on window server

vue2 + electron 用超简单方法搭建前端桌面应用_vue 2.0 安装electron-程序员宅基地

文章浏览阅读564次。vue2 + electron 非常简单的搭建方法_vue 2.0 安装electron

【初学者】SVG图片加载失败,求解_解析失败 (带有png备选的svg(mathml可通过浏览器插件启用)-程序员宅基地

文章浏览阅读2.6k次。最近在做期末作业,用Jekyll架站,前几天添加的svg图片还能加载,今天就不能了在hbuilder上是这样写的,前几天添加的svg图片还能加载,今天就不能了。用chrome检查是这样的请问应该怎么解决?..._解析失败 (带有png备选的svg(mathml可通过浏览器插件启用)

推荐文章

热门文章

相关标签