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

智能推荐

fprintf()、fscanf()、fwrite()、fread()用法与区别-程序员宅基地

文章浏览阅读1.3k次,点赞2次,收藏31次。其中,fprintf()和fscanf()的用法类似于printf()和scanf(),只是输出和输入的地方改成了文件流。类似于scanf()函数,但是scanf()用于从标准输入设备(键盘)中读取数据,而fscanf()用于从文件中读取数据。返回值:成功读取并匹配的输入项数,如果没有匹配到任何数据,则返回0,如果发生错误,则返回一个负数。fprintf():按照指定的格式将数据输出到指定的文件流中。fread():从指定的文件流中读取指定数量的数据块。fwrite():将指定的数据块写入指定的文件流中。_fprintf

Windows 10搭建FTP 服务器保姆教学_win10ftr服务器-程序员宅基地

文章浏览阅读1k次。windows10搭建FTP服务器保姆教程:Ⅰ。我们需要打开windows的FTP服务器功能。Ⅱ。我们需要切断防火墙对FTP服务器的拦截。Ⅲ。新建一个本地用户。Ⅳ。新建一个存放传输文件的文件夹Ⅴ。搭建FTP服务器。_win10ftr服务器

Unity插件——Odin 学习笔记(一)_unity odin-程序员宅基地

文章浏览阅读2.6w次,点赞27次,收藏108次。本文章是为了记录学习Unity插件Odin,使用该插件可以让我们更快速便捷的开发Unity工具前言Unity原生编辑编辑器的方法有两种——IMGUI和新的UIElement1.UIElement我之前做过介绍,开发模式类似于HTML+CSS,如果有类似经验的人开发及相对容易,但是就目前而言不太适合编辑器开发,我觉得比较适合取代UGUI进行UI开发2.IMGUI入门比较简单,使用Edit..._unity odin

python 数据类型介绍_python中数据类型的作用-程序员宅基地

文章浏览阅读1.8k次。在 Python 中,数据类型是区分数据的种类和存储方式的标识符。它定义了数据的取值范围、占用空间大小、可操作特性等。Python 中常见的数据类型包括数字、字符串、列表、元组、集合和字典等。数据类型在编程中的作用主要有以下几个方面:不同的数据类型需要占用不同的内存空间,因此在内存空间的管理上,数据类型具有重要的作用。例如,在处理大量数据时,选择合适的数据类型可以有效地减少内存占用,提高程序的执行效率。数据类型定义了数据的表达方式和可操作性,使得程序能够对不同类型的数据进行有效的处理。_python中数据类型的作用

[kubernetes]-kubernetes使用nodeport暴露jacoco地址_kubernetes暴露jacoco端口-程序员宅基地

文章浏览阅读740次。测试环境 需要启动jacoco 并暴露端口 replicas为1 但是node为2个 没有指定pod在哪个节点上启动。因此打算用nodeport的方式暴露出来,这样认准一个node+nodeport就可以跑jacoco了haozhuo-health-deployment.yamlapiVersion: apps/v1kind: Deploymentmetadata:# deployment名字 和svc 和ingress绑定没关系 name: haozhuo-health-dp na_kubernetes暴露jacoco端口

SpringCloud整合项目Maven导入失败无法解析 org.springframework.cloud:spring-cloud-starter-XXXX:unknown_无法解析 org.springframework.cloud:spring-cloud-depend-程序员宅基地

文章浏览阅读1.6k次。springcloud maven导入失败_无法解析 org.springframework.cloud:spring-cloud-dependencies:pom:finchley.m8

随便推点

PyCharm入门教程——保存和还原更改_pycharm您的本地更改将被合并覆盖。 提交、存储或还原您的更改以继续-程序员宅基地

文章浏览阅读4.9k次。PyCharm最新版本下载JetBrains PyCharm是一种Python IDE,其带有一整套可以帮助用户在使用Python语言开发时提高其效率的工具。此外,该IDE提供了一些高级功能,以用于Django框架下的专业Web开发。PyCharm会自动保存您在文件中所做的更改。保存由各种事件触发,例如编译、运行、调试、执行版本控制操作、关闭文件或项目或完全退出IDE。实际事件是预定义的,..._pycharm您的本地更改将被合并覆盖。 提交、存储或还原您的更改以继续

机器学习-决策树:python “AttributeError: '_csv.reader' object has no attribute'next'”_attributeerror: '_csv.writer' object has no attrib-程序员宅基地

文章浏览阅读532次。(1)reader.next()改为next(reader)(2)open(‘AllElectronics.csv’, ‘rb’)中的rb改成rt_attributeerror: '_csv.writer' object has no attribute 'writeheader

银行卡验证工具类分享_private static card card = card.getinstance();-程序员宅基地

文章浏览阅读4.9k次。用于验证的请求接口:https://ccdcapi.alipay.com/validateAndCacheCardInfo.json?_input_charset=utf-8&cardNo=6217002430035835629&cardBinCheck=true返回:{“bank”:”CCB”,”validated”:true,”cardType”:”DC”,”key”:”621700243003_private static card card = card.getinstance();

fatal error C1083: 无法打开包括文件: “Eigen\Dense”: No such file or directory_c1083无法打开包括文件: “eigen/dense”: no such file or dire-程序员宅基地

文章浏览阅读7.9k次,点赞18次,收藏30次。参考资料:CSDN、博客园等网上众多资料Eigen库,哎,感觉自己好蠢~我的包含路径是到你的路径…\Eigen我include<Eigen\Dense>标红,其实只要include就行,因为你的路径已经包含到Eigenl了这里要记一下的是你的包含路径到你要找的库的前一级用图来解释一下吧!我的Eigen库路径如下先来一波错误示范:在这里我们要使用Eigen下的Dense..._c1083无法打开包括文件: “eigen/dense”: no such file or directoryh:\work\6

科研绘图学习笔记1_科研笔记1:科研绘图-程序员宅基地

文章浏览阅读182次。在选定对应的色轮配色方案后,我们可根据它提供的 HEX 颜色码或 R、G、B 值进行配色的拾取,从而完成插图颜色的选择。ColorBrewer 2.0 是一个专业的在线配色方案网站,它提供了大量的颜色搭配主题,这些主题是众多绘图工具(如 Matplotlib、ggplot2 等)内置的绘图颜色主题。要避免出现文字较少、图表较多的情况,即无须将原始数据和中间处理过程涉及的插图全部展示在论文中,而应在有复杂和多维数据的情况下,提高精选插图的能力,而非简单地堆砌插图。在科研论文配图绘制的过程中应用较少。_科研笔记1:科研绘图

2020年南大计算机、软件工程考研经验分享_南京大学考研压分吗-程序员宅基地

文章浏览阅读2.1w次,点赞40次,收藏150次。南大20计算机学院考研打算考南京大学通信的学弟学妹你们好,首先欢迎大家选择我们计算机学院,计算机学院是我们学校的王牌学院。为了帮大家更好的了解我们学院的情况以及如何准备考研,我将从以下两个方面来介绍,觉得我写的还尚可的话,可以给我手动点赞哈。(2020年南大计算机考研资料分享及经验交流群:645638416)1:学院报考情况由于2019年的南京大学考研的数据在2020年的9月份才会公布..._南京大学考研压分吗

推荐文章

热门文章

相关标签