bash 订阅
Bash,Unix shell的一种,在1987年由布莱恩·福克斯为了GNU计划而编写。1989年发布第一个正式版本,原先是计划用在GNU操作系统上,但能运行于大多数类Unix系统的操作系统之上,包括Linux与Mac OS X v10.4都将它作为默认shell。Bash是Bourne shell的后继兼容版本与开放源代码版本,它的名称来自Bourne shell(sh)的一个双关语(Bourne again / born again):Bourne-Again SHell。Bash是一个命令处理器,通常运行于文本窗口中,并能执行用户直接输入的命令。Bash还能从文件中读取命令,这样的文件称为脚本。和其他Unix shell 一样,它支持文件名替换(通配符匹配)、管道、here文档、命令替换、变量,以及条件判断和循环遍历的结构控制语句。包括关键字、语法在内的基本特性全部是从sh借鉴过来的。其他特性,例如历史命令,是从csh和ksh借鉴而来。总的来说,Bash虽然是一个满足POSIX规范的shell,但有很多扩展。一个名为Shellshock的安全漏洞在2014年9月初被发现,并迅速导致互联网上的一系列攻击。这个漏洞可追溯到1989年发布的1.03版本。 展开全文
Bash,Unix shell的一种,在1987年由布莱恩·福克斯为了GNU计划而编写。1989年发布第一个正式版本,原先是计划用在GNU操作系统上,但能运行于大多数类Unix系统的操作系统之上,包括Linux与Mac OS X v10.4都将它作为默认shell。Bash是Bourne shell的后继兼容版本与开放源代码版本,它的名称来自Bourne shell(sh)的一个双关语(Bourne again / born again):Bourne-Again SHell。Bash是一个命令处理器,通常运行于文本窗口中,并能执行用户直接输入的命令。Bash还能从文件中读取命令,这样的文件称为脚本。和其他Unix shell 一样,它支持文件名替换(通配符匹配)、管道、here文档、命令替换、变量,以及条件判断和循环遍历的结构控制语句。包括关键字、语法在内的基本特性全部是从sh借鉴过来的。其他特性,例如历史命令,是从csh和ksh借鉴而来。总的来说,Bash虽然是一个满足POSIX规范的shell,但有很多扩展。一个名为Shellshock的安全漏洞在2014年9月初被发现,并迅速导致互联网上的一系列攻击。这个漏洞可追溯到1989年发布的1.03版本。
信息
外文名
bash
类    别
计算机程序
命令语法
Bourne shell命令语法的超集
中文名
重击
全    称
Bourne-Again Shell
bash概念
Bash (GNU Bourne-Again Shell) 是许多Linux发行版的默认Shell [1]  。事实上,还有许多传统UNIX上用的Shell,例如tcsh、csh、ash、bsh、ksh等等,Shell Script大致都类同,当您学会一种Shell以后,其它的Shell会很快就上手,大多数的时候,一个Shell Script通常可以在很多种Shell上使用。bash是大多数Linux系统以及Mac OS X默认的shell,它能运行于大多数类Unix风格的操作系统之上,甚至被移植到了Microsoft Windows上的Cygwin系统中,以实现Windows的POSIX虚拟接口。此外,它也被DJGPP项目移植到了MS-DOS上。bash的命令语法是Bourne shell命令语法的超集。数量庞大的Bourne shell脚本大多不经修改即可以在bash中执行,只有使用了Bourne的特殊变量或内置命令的脚本才需要修改。 bash的命令语法很多来自Korn shell (ksh) 和 C shell (csh), 例如命令行编辑,命令历史,目录栈,$RANDOM 和 $PPID 变量,以及POSIX的命令置换语法: $(...)。作为一个交互式的shell,按下TAB键即可自动补全已部分输入的程序名、文件名、变量名等等。 [2] 
收起全文
精华内容
下载资源
问答
  • bash
    千次阅读
    2021-05-11 07:26:56

    一般而言,Bash Shell 是很多 Linux 发行版的默认 Shell,所以会随着系统的安装而自动安装。不过确实有一部分读者想要安装较新版本的 Bash Shell,所以本节会具体讲一下其安装方法,希望可以作为读者全新安装 Bash Shell 或者虽然已经安装但希望升级的参考。

    确定你的 Shell 版本

    如果你安装的 Linux 是 RedHat、CentOS、Fedora、Ubuntu、Debian 等主流发行版,那么在你的系统中很可能已经预装了 Bash Shell,只需要确认一下是否确实已经安装以及预装的版本即可。具体的方法是:

    # 确认系统中使用的 Shell 是 bash

    $ echo $SHELL

    /bin/bash

    # 查看系统中 Bash Shell 的版本(方法一)

    $ bash --version

    GNU bash, version 3.2.25(1)-release (i686-redhat-linux-gnu)

    Copyright (C) 2005 Free Software Foundation, Inc.

    # 查看系统中 Bash Shell 的版本(方法二)

    $ echo $BASH_VERSION

    3.2.25(1)-release

    源码方式安装 Bash

    Linux 下安装软件的方式无非是 RPM 包安装、yum 安装、源码安装三种方式,读者可以任选一种方式。

    不过,相对来说 RPM 包安装和 yum 安装方式比较简单,若再考虑各种包的依赖关系,这两种方式中又属 yum 安装更为简单。这里就不详细介绍这两种安装方法了,下面会具体示范使用源码安装 bash 的过程。

    首先访问 http://www.gnu.org/software/bash/bash.html 页面,在 Downloads 中选择一个下载的链接,笔者选择了中国科技大学提供的FTP下载目录:ftp://mirrors.ustc.edu.cn/gnu/bash/。

    当前很多生产环境的系统中使用的 bash 版本还是 3.2 版,读者可以根据实际需要选择具体的版本。在笔者撰写本教程时,最新的版本是 4.2 版本,所以这里使用这个版本来做示范。

    1) 使用wget下载最新的 bash 源码包

    具体操作如下所示:

    $ wget ftp://mirrors.ustc.edu.cn/gnu/bash/bash-4.2.tar.gz

    --2013-04-11 19:37:41-- ftp://mirrors.ustc.edu.cn/gnu/bash/bash-4.2.tar.gz

    => `bash-4.2.tar.gz'

    Resolving mirrors.ustc.edu.cn... 202.141.160.110, 2001:da8:d800:95::110

    Connecting to mirrors.ustc.edu.cn|202.141.160.110|:21... connected.

    Logging in as anonymous ... Logged in!

    ==> SYST ... done. ==> PWD ... done.

    ==> TYPE I ... done. ==> CWD /gnu/bash ... done.

    ==> SIZE bash-4.2.tar.gz ... 7009201

    ==> PASV ... done. ==> RETR bash-4.2.tar.gz ... done.

    Length: 7009201 (6.7M)

    100%[==========================================>] 7,009,201 1.93M/s in 3.5s

    2013-04-11 19:37:46 (1.89 MB/s) - `bash-4.2.tar.gz' saved [7009201]

    2) 解压源码包

    解压源码包并进入生成的目录中:

    # 解压后会在当前目录下生成一个bash-4.2目录

    $ tar zxvf bash-4.2.tar.gz

    #进入目录bash-4.2

    $ cd bash-4.2

    $

    3) 准备配置(configure)

    最简单的配置方式是直接运行当前目录下的 configure,这会将 bash 安装到 /usr/local 目录中,不过编译安装软件时,好的习惯是使用--prefix参数指定安装目录。所以这里采用下面的配置方式。该条命令将会产生大量的输出,一开始会检查系统的编译环境以及相关的依赖软件。

    最常见的错误可能是系统中没有安装 gcc 造成无法继续,如果是这个原因,使用 yum install gcc 命令进行安装。如果配置过程出现致命错误会立即退出,请读者注意输出内容中的 error 部分。

    $ ./configure --prefix=/usr/local/bash4.2

    checking build system type... i686-pc-linux-gnu

    checking host system type... i686-pc-linux-gnu

    Beginning configuration for bash-4.2-release for i686-pc-linux-gnu

    checking for gcc... gcc

    checking for C compiler default output file name... a.out

    checking whether the C compiler works... Yes

    ......(略去内容)......

    #如果大量的 checking 没问题,则配置环境检测通过。如果读者看到如下的输出内容,说明配置成功

    configure: creating ./config.status

    config.status: creating Makefile

    config.status: creating builtins/Makefile

    config.status: creating lib/readline/Makefile

    config.status: creating lib/glob/Makefile

    config.status: creating lib/intl/Makefile

    config.status: creating lib/malloc/Makefile

    config.status: creating lib/sh/Makefile

    config.status: creating lib/termcap/Makefile

    config.status: creating lib/tilde/Makefile

    config.status: creating doc/Makefile

    config.status: creating support/Makefile

    config.status: creating po/Makefile.in

    config.status: creating examples/loadables/Makefile

    config.status: creating examples/loadables/perl/Makefile

    config.status: creating config.h

    config.status: executing default-1 commands

    config.status: creating po/POTFILES

    config.status: creating po/Makefile

    config.status: executing default commands

    #如果配置成功,会在当前目录中生成Makefile

    $ ll Makefile

    -rw-r--r-- 1 root root 77119 Apr 11 19:49 Makefile

    4) 正式编译

    #编译过程会产生大量输出

    $ make

    rm -f mksyntax

    gcc -DPROGRAM='"bash"' -DCONF_HOSTTYPE='"i686"'

    -DCONF_OSTYPE='"linux-gnu"' -DCONF_MACHTYPE='"i686-pc-linux-gnu"'

    -DCONF_VENDOR='"pc"'

    -DLOCALEDIR='"/usr/local/bash4.2/share/locale"'

    -DPACKAGE='"bash"' -DSHELL -DHAVE_CONFIG_H -I. -I. -I./include

    -I./lib -g -o mksyntax ./mksyntax.c

    ......(略去内容)......

    5) 安装

    有时在安装前也可以进行测试,但是一般情况下这不是必需的。

    #非必要步骤:测试安装

    #[root@localhost bash-4.2]# make test

    #安装

    $ make install

    #安装其实就是将make产生的文件复制到指定的目录中,在这里指定的目录就是之前我们用 --prefix 参数指定的/usr/local,可以在该目录中发现bash4.2目录

    $ ls -ld /usr/local/bash4.2/

    drwxr-xr-x 4 root root 4096 Apr 11 20:08 /usr/local/bash4.2/

    到此为止,最新版本的 bash 就已经安装好了,确切地说是安装到了 /usr/local/bash4.2 中。

    使用新版本的 Bash Shell

    虽然最新版的 bash 已经安装到系统中,但是还需要经过一些设置才能使用。首先需要将最新的 bash 的路径写到 /etc/shells 中,以向系统注册新 Shell 的路径。可以采取直接编辑 /etc/shells 文件的方式,或者采用如下更简单的方式:

    $ echo "/usr/local/bash4.2/bin/bash" >> /etc/shells

    然后使用命令 chsh(change shell 的简写)修改登录 Shell。

    $ chsh

    Changing shell for root.

    New shell [/bin/bash]: /usr/local/bash4.2/bin/bash #输入要修改的shell

    Shell changed. #显示成功修改了shell

    #此处chsh并没有附加参数,所以默认是修改root的shell,如要改变其他用户的登录shell,可以在后面跟上用户名,使用这种方式给用户john更改shell

    $ chsh john

    chsh 命令做的工作就是修改了 /etc/passwd 文件中登录 Shell 的路径,所以如果明白了 chsh 的原理,实际上可以手工编辑 /etc/passwd 文件,将 root 用户的这行改成下面的样子(这又一次印证了 Linux 中一切皆文件的说法):

    $ cat /etc/passwd | grep bash4.2

    root:x:0:0:root:/root:/usr/local/bash4.2/bin/bash

    最后还需要重新登录以获得 Shell,登录后再次验证一下当前的 Shell 版本。

    $ echo $BASH_VERSION

    4.2.0(1)-release

    #请注意,如果这时候你使用下面的命令可能会犯迷糊:为什么版本是3.2.25呢?不是已经是4.2了吗?

    $ bash --version

    GNU bash, version 3.2.25(1)-release (i686-redhat-linux-gnu)

    Copyright (C) 2005 Free Software Foundation, Inc.

    #通过使用 whereis bash 命令可了解当前运行的 bash 命令真实运行的是/bin/bash,也就是说现在是在版本为 4.2 的 bash 中运行了一个 3.2.25 版本的 bash 命令。如果要想每次运行 bash 的时候使用的是 4.2 的版本,需要修改 PATH 变量的值,读者可以自行完成这个任务

    $ whereis bash

    bash: /bin/bash /usr/local/bash4.2 /usr/share/man/man1/bash.1.gz

    更多相关内容
  • bash-4.4安装包,以及完整安装手册,已测试可行,解决低版本bash破壳漏洞问题,bash升级操作有一定风险,操作前需快照
  • Git_Bash工具

    2018-04-26 19:52:30
    Git Bash Git Bash Git Bash Git Bash Git Bash Git Bash
  • bash 运行文件#!bin/bash

    千次阅读 2020-10-18 18:04:17
    1 如何使用Chmod使Bash脚本可执行 引用自参考文献【1】 在本教程中,我将逐步介绍创建bash脚本并使用chmod命令使脚本可执行的步骤。之后,无需使用sh或bash命令就可以运行它。 步骤1: 创建一个Bash文件 首先是.sh...


    【参考文献】
    【1】 A5互联
    【2】 Shell基本用法
    【3】 shell计时

    1 如何使用Chmod使Bash脚本可执行

    引用自参考文献【1】
    在本教程中,我将逐步介绍创建bash脚本并使用chmod命令使脚本可执行的步骤。之后,无需使用sh或bash命令就可以运行它。
    步骤1: 创建一个Bash文件
    首先是.sh使用以下命令创建带有扩展名的新文本文件。

    $ touch hello_script.sh
    

    步骤2: 编写示例脚本
    使用任何喜欢的编辑器打开新创建的文件,将以下bash脚本添加到文件中。

    $ vim hello_script.sh
    
    #!/bin/bash
    echo "Hello World"
    

    使用保存并关闭文件:wq!。
    步骤3: 执行Bash脚本
    有两种方法可以运行bash文件。第一个是通过使用bash命令,另一个是通过将执行权限设置为bash文件。
    让我们运行以下命令以使用bash或sh命令执行bash脚本。

    $ bash hello_script.sh
    

    要么

    $ sh hello_script.sh
    

    步骤4: 将可执行权限设置为脚本
    执行bash脚本的第二种方法是设置可执行权限。
    要使脚本可执行文件,请使用+x或u+x,例如:

    $ chmod u+x hello_script.sh
    

    步骤5:运行可执行脚本
    将可执行文件权限分配给脚本后,可以运行不带bash命令的脚本,如下所示。

    $ ./hello_script.sh
    

    另一个示例
    在下面的示例中,我将编写并执行一个bash脚本以从源到目标进行备份。

    $ vim backup_script.sh
    
    #!/bin/bash
    TIME=`date +%b-%d-%y`
    DESTINATION=/home/kashif/backup-$BACKUPTIME.tar.gz
    SOURCE=/data_folder
    tar -cpzf $DESTINATION $SOURCE
    

    使用:wq!保存并关闭文件,并使用下面的命令赋予其可执行权限:

    $ chmod +x backup_script.sh
    

    现在运行脚本:

    $ ./backup_script
    

    2 shell教程

    2.0 运行程序

    以运行python为例,一个名为write_totTb.py的python文件,在终端上运行使用python write_totTb.py
    在这里插入图片描述
    现在不在终端运行,而是通过在bash里面运行,则bash的内容如下(名为test.sh):
    在这里插入图片描述
    然后直接运行test.sh

    #方法1
    sh test.sh
    #方法2
    chmod +x test.sh #加成可执行权限,运行之后看到文件变绿色
    ./test.sh  #运行可执行文件
    

    2.1 for 循环

    2.1.1 单层for循环

    这部分可以查看参考文献【2】Shell基本用法
    这里对for循环做一个说明,通常情况下我们的for循环是下面这个样子
    在这里插入图片描述
    不过系统为了加快速度,不是使用的bash,因此需要改如下(有两种方法,这里只说第一种,参考小小小羊羊羊):
    在这里插入图片描述
    在这里插入图片描述
    是从1开始的,一直到10,如果要从0开始,则

    在这里插入图片描述

    2.1.2 两层for循环

    在这里插入图片描述
    在这里插入图片描述

    2.1.3 循环列表

    连续列表可以使用

    for i in `seq 0 9` #从0到9共10个数
    or
    for i in {0..9}    #从0到9共10个数
    

    如果是不连续的列表,如[1,9,11,25], 则

    for i in 1 9 11 25
    do 
    	xxx
    done
    

    注意数字中间是空格,不能用{1,9,11,25}

    2.2 文件读写

    2.2.1 保存到文件

    有两种方式指定到文件

    > a.txt  写入文件
    >> a.txt 追加形式写入文件
    

    在这里插入图片描述

    2.2.2 终端的输出保存到文件

    参考博文
    在bash中,

    >标准输出
    2>错误输出
    <标准输入
    

    如果需要将终端输出的信息保存到文件中,可以认为终端的是warning或者error之类的,那么可以

    ./run.sh 2> err.log > info.txt  #表示错误信息(终端上的)输出到err.log, 而我们需要的输出值放到info.txt中
    

    2.2.3 读取文件并相加

    这里要实现读取两个.txt文件并相加
    两个文件a.txt和b.txt都如下:

    1
    2
    3
    

    需要读取并对应相加,得到的值应该是2,4,6
    实现思路:先将文件读取并保存到变量中,然后实现这两个变量求和(应该有更好的方法,比如不保存,而是直接求和)

    在这里插入图片描述

    2.2.4 利用tee一次性写入多个文件

    params.txt如下:
    在这里插入图片描述

    #!/bin/bash
    
    mapfile params_arr < params.txt 
    echo ${params_arr[@]}
    
    echo ${params_arr[0]} | tee a.txt b.txt c.txt # 将数组中的第一个数写入三个文件中
    

    在这里插入图片描述

    上面的方法tee写入的时候,会echo输出,为了不让输出可以将标准输出扔到“黑洞”中

    echo ${params_arr[0]} | tee a.txt b.txt c.txt >/dev/null
    

    2.3 运行时间

    参考【3】

    #/bin/bash
    declare starttime=`date +%s%N`
    declare endtime=`date +%s%N`
    c=`expr $endtime - $starttime`
    # do something 
    
    # end do something
    c=`expr $c / 1000000`  #从纳秒到毫秒
    echo "$c ms"
    

    计算机给的是纳秒,除以10的六次方得到毫秒,如果要得到秒,则上面除以10的九次方。
    从秒到分则是除以60

    c=`expr $c / 1000000`   # ms
    c=`expr $c / 1000000000` # s
    c=`expr $c / 60000000000`  #min
    

    更新
    上面的方法好像没用,一直都显示0,可以使用下面新方法

    #!/bin/bash
     
    start_time=$(date +%s)
    sleep 1
    
    ###
    运行程序
    ###
    
    end_time=$(date +%s)
    cost_time=$[ $end_time-$start_time ]
    echo "time cost: $(($cost_time/60))min $(($cost_time%60))s"
    

    在这里插入图片描述
    如果想把时间输出到文件上,则可以把最后一行改为

    echo "time cost: $(($cost_time/60))min $(($cost_time%60))s">time_cost.log
    

    此时查看time_cost.log就可以看到时间了

    2 另外一个方法是使用time关键字,
    比如test.sh文件为:
    在这里插入图片描述
    运行:

    time sh test.sh 
    or
    time bash test.sh
    

    得到
    在这里插入图片描述
    第一个real time就是表示程序运行所花的时间

    更新…
    计算时间间隔,可以调用date,两者相减,参考
    在这里插入图片描述

    start_time="$(date -u +%s.%N)"
    sleep 5
    end_time="$(date -u +%s.%N)"
    
    elapsed="$(bc <<<"$end_time-$start_time")"
    echo "Total of $elapsed seconds elapsed for process"
    
     Total of 5.001884264 seconds elapsed for process
    

    或者直接调用内置变量SECONDS计时,参考

    SECONDS=0
    # do some work
    duration=$SECONDS
    echo "$(($duration / 60)) minutes and $(($duration % 60)) seconds elapsed."
    

    文中说需要先SECONDS=0,实际上默认第一次调用就是0,所以也可以不用初始化为0(更新:必须设置SECONDS=0,否则可能不对,比如下面设置小于等于10一直运行,如果不初始化SECONDS=0,则可能4秒就结束了)
    使用循环

    SECONDS=0
    while [ $SECONDS -le 10 ]
    do
    	echo $SECONDS
    done
    

    2.4 数组

    2.4.1 数组定义和索引

    参考博文
    使用括号括起来,空格隔开,如:(注意复制号前后不能空)
    在这里插入图片描述
    运行之后
    在这里插入图片描述
    数组的索引是从0开始的,因此要获得某个变量的值可以如下:($不可少)
    在这里插入图片描述

    2.4.2 数组创建

    创建数组除了直接定义如a=(1,2,3)外,还可以借助seq来创建

    a=$(seq 0 5)  # 从0到5的list,即a=[0,1,2,3,4,5]
    a=($(seq 0 5)) # 从0到5的数组array,即a=np.array([0,1,2,3,4,5])
    

    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述

    其中seq还可以创建小数位数的数组

    只要让增量为小数即可,如
    在这里插入图片描述
    另一个方便的方法是:

    for i in {0..5} #则i=0,1,2,3,4,5共6个数
    

    2.4.3 数组长度

    数组长度有两个方法:
    在这里插入图片描述
    在终端上输入:
    在这里插入图片描述
    第一行表示数组从0.7430到0.8320,间隔为0.0001
    第二行表示数组长度,输出为:
    在这里插入图片描述

    2.4.4 mapfile读文件到数组–bash

    有一个params.txt文件,如下:

    通过mapfile读到数组中,代码文件名为test.sh

    #!/bin/bash
    
    mapfile params_arr < params.txt  #读到数组
    echo ${params_arr[0]}   # 返回第一个数组值
    

    运行bash test.sh得到

    307200
    

    如果要读取数组全部内容,需要

    echo ${params_arr[@]}  #全部
    echo ${params_arr}    #只读第一个数
    

    2.4.5 读文件到数组–sh

    sh不能像bash一样使用mapfile(发现手机的sh和linux自带的sh不一样,linux自带的应该是可以用2.4.4节的方法,但是手机的只能用本节方法),比如Android手机是没有bash的,只有sh,这个时候可以一行一行的读,然后加载到文件
    比如

    m=0
    for line in `cat /data/local/tmp/params.txt`
    do 
        params[$m]=$line 
        ((m++))
    done 
    echo ${params[@]}
    echo ${params[0]}
    echo ${params[1]}
    echo ${params[4]}
    
    307200 307200 633600 633600 806400 806400
    307200
    307200
    806400
    
    

    2.4.5 数组最后一个数/索引

    在比较高版本的bash中,数组最后一个数可以像python一样用-1来读,如

    #!/bin/bash
    a=(1 2 3 4)
    echo ${a[-1]}   #直接获取最后一个数
    echo ${a[${#a[@]}-1]}   #先获取数组长度,然后再获取最后一个的索引
    
    4
    4
    

    在手机adb中,只能使用后者

    2.5 参数传递

    2.5.0 无参数–bash运行python

    有一个add.py文件,内容为:
    在这里插入图片描述
    建立一个run.sh脚本,内容为:
    在这里插入图片描述
    则通过

    sh run.sh 
    or 
    bash run.sh
    

    则可以实现bash来运行python的功能,这个简易的功能对某些情况非常有效,如对python很熟,但对bash不熟的情况,可以将代码用大量的python写,之后用bash来传递参数进行提交作业等简易工作。(如下两个例子)

    2.5.1 单参数传递–运行python

    假如有一个名为test.py的python文件,里面需要传递一个参数,那么可以通过run.sh来传递如下:

    for i in {0..2}
    do
    	python test.py $i
    done
    

    在test.py中要用sys接收这个参数
    test.py如下:

    import sys
    i = int(sys.argv[1]) #int也可以改为想要的类型,如str,float等,1表示第一个参数
    xxx
    

    这里的 i i i(可以任意命名)表示接收的上面run.sh的参数 i i i
    这样就把参数传递到python文件里面了。

    但这样做没有提高计算速度,实际上相当于在python的test.py里面加了一层循环而已,现在可以通过提交多个文件的方式提高速度,相当于多次任务,每个任务都是1分钟的话,那么总的任务也是1分钟,这些任务是分开计算的。
    假如有一个名为test.py的python文件,里面需要传递一个参数,
    run.sh
    在这里插入图片描述
    test.sh
    在这里插入图片描述
    其中$1表示传入的第一个参数,即run.sh的i
    在这里插入图片描述

    2.5.2 举例1,多参数传递

    目标:要实现多参数传递。
    有一个名为run.sh的文件,如下:(实现的功能为,利用hep_sub提交任务到服务器,并在atm_xv_xd.sh中有两个参数需要传递,第一个参数为循环的[0,1,2],第二个参数为数组array([2.70,2.71,...,3.10]),即间隔为0.01的数组。错误信息填在err.log中,输出信息填在out.log中
    在这里插入图片描述
    其中atm_xv_xd.sh为:
    在这里插入图片描述
    所以在out.log的结果如下:

    在这里插入图片描述
    对于am来计算大气,则atm_xv_xd.sh可以如下:
    在这里插入图片描述
    再以读取文件时的参数传递为例:
    一般文本保存都是以数字来有序标记,比如test0.txt, test1.txt等,那么读取文件的时候也可以按顺序读取,
    现在 a.sh如下:循环[0,1],提交作业到服务器
    在这里插入图片描述
    am_run.sh如下
    在这里插入图片描述
    读取test0.txttest1.txt文件,注意,上面的$1表示的是传递第一个参数,即前面的loop,而不是表示第一个文件!

    2.5.4 adb参数传递

    这里主要讨论adb参数比较多的情况,比如获取一个正在运行的进程的pid,发现会有多个,这个时候在手机adb直接传数组会出错,此时的方法是先保存到文件,然后再读取文件内容到数组
    在这里插入图片描述

    2.6 条件判断

    2.6.1 if语句

    举例1:
    在这里插入图片描述
    其中:
    在这里插入图片描述
    所以结果为:
    在这里插入图片描述

    举例2:取余,当余数为0打印出数。注意等号那儿有空格。

    在这里插入图片描述
    在这里插入图片描述

    for i in {0..100}
    do
            b=$(($i%10))
            if [ $b = 0 ];then
                    echo $i
            fi
    done
    ~     
    

    3 常见问题

    3.1 提交作业运行时间很长

    最近遇到一个问题,有个run.sh文件用于提交432分作业,然后每份作业计算361个点。每个点在本地计算大约4 s,只提交一次作业到服务器计算一个点大约0.5 s,现在提交432分作业,每份361个点,那么时间应该是361*0.4=144.4s,但结果却出奇的慢
    在这里插入图片描述
    在这里插入图片描述
    这主要是因为输出错误文件都到err.log了,导致这个文件一直打开封闭直接读写,因此会出矛盾,也不能用>>data/err.log来追加,因为这样只能等所有文件都写完才能关闭这个文件,才算结束,这就等于串行了。修改方法为:err.log单独保存

    #单独保存
    am 00001.amc ${x[$k]} ${y[$k]} 2>data/jacobian/test/err${k}.log> data/jacobian/test/det_$1_ring_${k}.out
    
    展开全文
  • Linux里面Bash的使用方法

    千次阅读 2021-12-20 14:13:26
    2021SC@SDUSC Shell shell是一个程序,可以称之为壳程序,用于用户与操作系统进行交互。用来区别与核,相当于是一个命令解析器,Shell有很多中,这里列出其中几种 ...bash命令是sh命令的超集,大多数sh脚本

    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个位置。

    展开全文
  • Git教程 Git Bash详细教程

    万次阅读 多人点赞 2018-01-17 16:12:58
    作为一个萌新,我翻遍了网上的Git Bash教程,可能因为我理解力比较差,经常看不懂教程上在说什么。 (。-`ω´-)所以我决定自己一边摸索一边记录,写教程造福那些理解力跟我一样差的人…… 第一篇教程会涉及...

    作为一个萌新,最近在学怎么用github,我翻遍了网上的Git Bash教程,可能因为我理解力比较差,经常看不懂教程上在说什么。
    让我一度感觉自己是个傻子。最终 (。-`ω´-)我决定自己一边摸索,一边记录,写教程造福那些理解力跟我一样差的人……



    这个主要介绍Git Bash的使用教程。

    1 下载安装

    首先抛一个Windows用户的下载链接:Git for windows
    下载下来之后直接安装,除了下图选第一个,其他的不用改,直接next就行。
    选这个use git from git bash only
    在这里插入图片描述
    安装完成后我的电脑上是显示了这么三个东西的。
    这里写图片描述

    • Git CMD:
        Git CMD我并没用过,但是我查了一下它是什么。据别人说,Git中的Bash是基于CMD的,在CMD的基础上增添一些新的命令与功能。所以建议在使用的时候,用Bash更加方便(原网址)。
    • Git GUI:
        其次就是Git GUI,Git GUI是Git Bash的替代品,他为Windows用户提供了更简便易懂的图形界面。(但是相比GitHub Desktop这个桌面版客户端,_(:3 」∠)我觉得Git GUI也没什么用。)
    • Git Bash:
        最后是Git Bash,Git Bash是命令行操作,官方介绍有一句就是“让*nix用户感到宾至如归。”((;´༎ຶД༎ຶ`) 当然了,萌新用户使用了就肥肠憋屈。)

    2 设置用户

    下载之后打开是这个样子的,第一件事设置用户。注意这个不是登录哦,是给你的电脑设置一个用户,等你上传的时候,告诉远程仓库是谁上传的而已。

    git config --global user.name "Your Name"注意前边是“- -global”,有两个横线
    git config --global user.email "email@example.com"
    在这里插入图片描述


    3 本地文件夹的操作

    3.1 进入文件夹

    首先你可以试着打开你本地仓库的文件夹。
    比如我要打开E:\code有两种方法

    1. 直接在电脑上打开那个文件夹,然后在文件夹空白处右键选择Git Bash here
      在这里插入图片描述

    2. 在Git Bash中输入路径
      注意! 使用cd命令进入到目录中时,在Git-Bash中应该使用斜线”/”, 而不是反斜线”\”
      ①可以逐个输入文件夹名(在文件夹名称前要加cd )
      在这里插入图片描述
      ②也可以直接输入一个完整的文件夹路径
      在这里插入图片描述

    3.2 查看

    • 当前目录
      你输入命令之前上边有一行字,后边那段黄色的就是你所在的文件夹位置。你也可以输入$ pwd,回车之后进行查看。在这里插入图片描述
    • 查看当前文件夹都有什么文件$ ls
      在这里插入图片描述

    3.3 退出文件夹

    当然你也可能进错文件夹,要学会回退。
    $ cd .. 点和cd之间有空格

    就可以回退到上一个文件夹。
    在这里插入图片描述

    3.4 新建、删除

    $ mkdir +文件夹名字 只能新建文件夹
    我在E盘的code文件夹下新建一个front-end文件夹。建完之后打开文件夹看看创建成功了嗷。
    在这里插入图片描述
    touch +文件名 只能新建文件
    在这里插入图片描述

    $ rm 文件名.文件类型 删除文件
    在这里插入图片描述
    $ rm -r 文件夹删除文件夹 ,注意这个要回到上一级文件夹才可以删。比如我要删除front-end文件夹,front-end在code里边,我就要在code目录下删除。
    在这里插入图片描述


    4 仓库设置

    你既然学git,那就是想要把本地的代码放到远程仓库托管。
    托管就是,代码是小朋友,你就是他父母,你把它丢到托儿所,让托儿所帮你管。怎么去托儿所,总不能一生下来就在托儿所。你得把孩子从家里送过去吧。放学了你得把孩子接回来吧。(当然这个例子不太恰当。)
    那你需要一个本地存储代码的地方(家里),你还需要一个远程仓库(托儿所)

    4.1 初始化本地仓库

    进入到你想建立本地仓库的文件夹,它可以是空的,你建好了之后再写代码。里边也可以有东西,直接建就好。
    $ git init
    我用个空文件夹做示范:E:\code\front-end
    在这里插入图片描述
    初始化成功之后,你的文件夹里就会多出.git的隐藏文件。 (●′ω`●)千万不要乱删,你如果看他烦你就设置一下不显示隐藏文件。

    4.2 新建远程仓库

    打开github右上角,点击new repository
    在这里插入图片描述
    在这里插入图片描述

    • 说一下仓库的私有和公有
      本来也是个开源社区,很多大佬们都把自己的东西开源了,也就是放在共有仓库里,可以让人查阅。也鼓励大家使用共有仓库 (๑•́ ₃•̀๑)。
      以前使用私有仓库是付费, 或者你可以申请学生认证获得私有仓库的使用权。但是现在2020年3月份的时候我收到github的邮件,邮件里边说现在已经开放私有仓库的使用了。
    • 说一下学生认证
      以前github的教育认证可以让学生和教育者免费使用私有仓库,并且还有许多其他的优惠政策。比如github的一些付费功能,教育认证之后会有巨大的折扣。戳我查看如何进行学生认证╰(●’◡’●)╮

    4.3 建立连接

    孩子在家里,你能用意念让他直接飞到托儿所吗,显然不可能,那你总得把他送过去,或者用校车之类的吧。
    那现在就得想办法建立远程仓库和本地仓库的连接。
    4.3.1 配置SSH,给孩子联系好校车。
    ヽ(・ω・。)ノ点击进入《SSH Key配置教程》
    4.3.2 配置完SSH,你就可以使用SSH连接了。
    注意,你是仓库的主人你才能使用SSH连接,如果你不是仓库主人,只是某个项目的成员,那你只能使用HTTPS连接。
    不管使用哪一种连接方式,都是一样操作,现在我就用SSH链接了。复制红框框里的代码。
    在这里插入图片描述
    4.3.3 在你的本地仓库打开gitbash。
    $ git remote add + 名字 + 连接地址
    连接地址就是你刚才复制的那块。
    我下边写的就是添加一个叫origin的远程仓库。
    在这里插入图片描述

    • 名字origin:你在往远程仓库推送的时候,你会说我要推给谁,总得给它起个名字。(你把孩子送去托儿所,你总得告诉司机是哪个托儿所吧)并且你以后可能会一个本地仓库连接多个远程仓库(这是后话),所以必须起名字加以区分。
    • 补充一下:你的本地仓库可以链接多个原厂仓库,github毕竟是国外的,有时候访问起来会很慢,因此你可以连接到国内的仓库上,比如gitee之类的。详细可以等你学会了这个文章之后,戳一下看这一篇→git bash 连接多个远程仓库

    4.3.4 添加之后没有任何提示,如果你想确定是否成功了,你可以再输一遍,这时候他会提示你刚才已经设置过了。
    在这里插入图片描述
    上边的方法能用但是比较笨(…•˘_˘•…),所以你得学个高端一点的。
    $ git remote -v
    测试一下,看到没。显示我已经添加了叫origin的仓库。一个push一个fetch,就是一个把代码推到远程仓库,一个把代码从远程仓库取回来。这两个一定是成对存在的。
    在这里插入图片描述
    补充一点:如果你以后不想连接这个远程仓库了,只需要输入git remote remove + 名字即可。比如我刚才添加的远程仓库代称是origin,那我就要写:git remote remove origin

    4.4 文件上传

    4.4.1 git add修改的文件添加暂存区,也就是将要提交的文件的信息添加到索引库中。(看不懂没关系,现在来说这个不重要)。
    什么是修改的文件,你新建、更改、删除文件都是修改。
    git add有好多种。下边我介绍一下,看看就行,对现在来说记住最后一条就可以了

    • $ git add +文件名.文件类型 ,将某个文件加到缓存区
    • $ git add +文件名.文件类型 ... 文件名.文件类型 ,将n个文件添加到缓存区
    • $ git add xx文件夹/*.html,将xx文件夹下的所有的html文件添加到缓存区。
    • $ git add *hhh ,将以hhh结尾的文件的所有修改添加到暂存区
    • $ git add Hello* ,将所有以Hello开头的文件的修改添加到暂存区
    • git add -u ,提交被修改(modified)和被删除(deleted)文件,不包括新文件(new)
    • git add .,提交新文件(new)和被修改(modified)文件,不包括被删除(deleted)文件
    • git add -A,提交所有变化git add前几条都可以记不住,这个必须记住!!!

    在这里插入图片描述
    我现在在本地仓库新建一个文件叫readme.md,现在我将它添加到缓存区。(没错虽然图里是read,但是我就是要创建叫readme的文件,往后看就明白了)
    在这里插入图片描述

    4.4.2 git commit 将当前暂存区的文件实际保存到仓库的历史记录中(看不懂没关系,现在来说这个不重要)。你现在可以简单的理解为给你刚才add的东西加一个备注,你上传到远程仓库之后,修改的文件后边会显示这个备注
    $ git commit -m "修改注释"
    在这里插入图片描述
    一定要加-m,否则会进入vim编辑器,对新手很不友好,所以还是加上-m
    4.4.3 git push激动的搓搓小手,终于要把文件推到远程仓库了。
    向一个空的新仓库中推文件:$ git push -u 仓库名称 分支

    • 仓库名称:刚才我添加连接的时候,给仓库起名叫origin
    • 分支:你现在只有主分支,所以分支直接写master。以后合作项目的时候,成员之间建了不同的分支,你就可以往你自己的分支上推。

    在这里插入图片描述
    我们第一次推送master分支时,加上 –u参数才会把本地的master分支和远程的master分支关联起来,就是告诉远程仓库的master分支,我的本地仓库和是对着你的哦,不是对着别的分支的哦。
    只有第一次推的时候需要加上-u,以后的推送只输入:
    $ git push 名称 分支
    还有一个$ git push origin master -f 强制推送,如果你某次推送失败,git bash报错,你懒得处理错误,你就可以用这个。但是有风险,因为报错90%是因为你本地仓库和远程仓库数据发生冲突,使用这个会直接用本地数据覆盖掉远程数据,可能损失数据哦。

    现在你去网页版刷新一下,就可以看到你本地仓库的东西都在那里了。并且文件后边写着你在commit步骤中添加的注释。
    在这里插入图片描述
    4.4.4 其他
    (눈_눈)我缓缓打出一个问号,我的commit怎么多写了一个e?我文件名字叫readme我怎么就写了read
    先来看看怎么查看自己的提交记录?虽然写错了查看提交记录也没用。我就是单纯想让你们多学一条命令:
    $ git log
    在这里插入图片描述
    提交记录里也显示我就是多写了一个e。

    • 怎么抢救一下commit的注释?
      $ git commit --amend -m "修改的内容"
    • 那怎么抢救一下文件名?
      直接修改文件名重新提交就可以啦。
      git add -A —> git commit -m “修改文件名” —> git push origin master
      在这里插入图片描述
      ?push时候报错?
      这是因为github觉得我的本地仓库和远程仓库冲突了:
      因为我刚才在本地修改了上一次的commit信息。(后边详细解释
      $ git push origin master -f 这个-f就是force,强制推送。

    推完之后看看你的远程仓库,文件名改了,文件名后边的注释也是我第二次commit的注释。上边有个commit选项,
    在这里插入图片描述
    在这里插入图片描述

    • 补充解释
      • $ git commit --amend的作用:
        github不管你做错了啥,他都会给你保存的,就是即使你改了,你的错误记录永远存在!但是使用git commit --amend,你可以神不知鬼不觉悄咪咪修改你的错误commit注释,╭(●`∀´●)╯只有天知地知你知。

      • push时候报错:
        github你可以理解为差额备份,就是你本地提交上去之后,它备份起来。你本地修改了,它会对你修改的部分继续备份。也就是说在你这次修改之前,本地仓库应该和远程仓库一模一样。
        但是我刚才强行修改了上次的commit注释信息。现在本地仓库里;

        • 上次的commit是“新建了readme”,
          使用git log看一下,本地仓库上次的提交注释确实是改变了。在这里插入图片描述
        • 但是远程仓库上次的commit是“readmee”。

        我修改的是上次的commit,所以我这次推的时候github就认为这次修改之前的本地仓库和远程仓库不一样,因此就会报错说我数据冲突。

    4.5 文件下拉

    上边push报错,我自己知道数据差在哪里,所以使用了强制推送。但是在团队合作中,push报错,那铁定是你队友修改了远程仓库,如果你再强制上传,那你就是毁了你队友的代码。所以如何保证在你修改之前,自己的文件跟远程仓库一致呢。

    方法1: $ git pull 仓库名称

    尝试一下
    比如我现在跑到我的远程仓库修改了readme:

    • 点要修改的文件,进去之后点击编辑。
      在这里插入图片描述
    • 写内容
      在这里插入图片描述
    • 写完内容提交
      在这里插入图片描述
    • 这时候我已经修改成功了
      在这里插入图片描述
    • git pull完成之后打开本地的readme,发现hello world已经进来了嗷。
      在这里插入图片描述
    • git log看一下,commit的记录也显示了。
      在这里插入图片描述

    方法2:
    $ git fetch + $ git merge

    尝试一下,

    • 这次我又在远程仓库加一行字
      在这里插入图片描述
    • git fetch,看起来数据也是拉下来了,要 git merge干嘛。然鹅! 事情是这样的,git fetch之后,我打开本地文件,发现内容没变
      在这里插入图片描述
    • 那继续git merge,这之后本地文件内容才改变!
      在这里插入图片描述

    我在提示一下,我在fetch之后,不止没有修改本地文件,就连git log也没显示我下拉文件了,但是merge之后就都显示了。我们可以认为 pull = fetch+merge。git fetch 并没更改本地仓库的代码,只是拉取了远程数据,git merge才执行合并数据。

    回想一下你刚才是怎么push到远程的

    • git add添加到上传缓存区
    • git commit给缓存区的内容添加备注,此时本地的commit修改啦,但是远程的commit和文件都没修改。
    • git push 修改远程文件和commit信息

    而你下拉文件过程

    • git fetch 将数据拉下来,但是没修改本地的commit和文件
    • git merge 改变本地数据

    4.5 文件克隆

    下拉仓库学会了,那克隆呢?
    我现在有一个完整仓库,点击右边的绿色按钮。
    在这里插入图片描述
    在这里插入图片描述

    • 如果你只想看看源码,那你可以直接选download zip,下载源码压缩包。
    • 如果你使用的是git desktop,那你就选open in desktop
    • 如果你想学克隆你就继续看,很简单的就一句。

    仓库是你自己的,你就使用SSH连接,不是你自己的,你没权限你就切换到HTTPS,再复制地址。
    它克隆下来是一个文件夹,你想把文件夹放哪里就在哪打开gitbash
    $ git clone 加上你刚才的地址
    在这里插入图片描述
    我在E:\code\vue里执行了克隆。
    (。◕ˇ∀ˇ◕)。下载完成后,打开这个文件夹,就发现里边有个文件夹了。文件夹名字就是远程仓库的名字。
    在这里插入图片描述
    还记得git remote -v吗?用它看一下你下下来的本地仓库连接上那个远程仓库没。
    在这里插入图片描述
    已经连接了嗷。放心使用吧。

    4.6 git pull 和 git clone的区别

    git pull 和 git clone的区别


    我是萝莉Ann, 梦想是当个程序媛。(●´∀`)♪永不服输!

    展开全文
  • 如何使用 Bash 读取和处理 CSV 文件

    千次阅读 2022-05-11 09:47:40
    如何使用 Bash 读取和处理 CSV 文件
  • git bash 的基本使用方法(一)

    千次阅读 2022-02-10 00:44:26
    使用git bash窗口命令行进行简单的克隆,推送,拉取等操作。
  • bash简介

    万次阅读 多人点赞 2020-04-19 15:38:01
    shell和bash的概念 shell是一类程序的统称,这些软件只要是能够按照用户的要求去调用操作系统的接口,就可以称之为shell程序.所以shell不是具体哪一个款程序,是一类软件的统称. linux发展至今,有许多shell程序,其中一...
  • Bash与Csh比较

    2013-01-06 12:46:30
    Bash与Csh比较,在linux下的bash与csh的区别及用法,很实用
  • 这篇文章记录一下在MacOS上Bash版本的确认和升级方法。
  • 系统应该是Alpine Linux LXD(Linux容器),那么入股在其中安装 bash shell呢 apk update apk upgrade apk add bash # 安装 bash 文档 apk add bash-doc # 安装 bash 自动命令补全 apk add bash-completion # ...
  • Linux基础——Bash

    千次阅读 2022-03-09 19:53:51
    BashBash是什么?查看Linux中的Shell三级目录 Bash是什么? Bash 全称为Bourne Again SHell,是Shell程序的一种,提供一个界面,可让用户通过调用各种命令来操作系统 查看Linux中的Shell Linux默认使用bash 三级...
  • SuSE Linux Enterprise Server 10.3 Bash漏洞修复方案(含升级tar包),tar包集成最新的bash漏洞patch,直接按方案描述升级即可修复漏洞!
  • shell bash脚本With the arrival of Windows 10’s Bash shell, you can now create and run Bash shell scripts on Windows 10. You can also incorporate Bash commands into a Windows batch file or PowerShell ...
  • 很多时候我们可能需要获取文件夹下的文件名和扩展名用于任务处理,此时可以通过编写Bash脚本来实现。 实现 result_path1=task1 result_path2=task2 concat_path=concat-videos if [ ! -d "./$concat_path" ]; then ...
  • 高级Bash Shell脚本编程指南

    热门讨论 2014-07-16 15:34:32
    毫无疑问,UNIX/Linux 最重要的软件之一就是shell,目前最流行的shell 被称为Bash(Bourne AgainShell),几乎所有的Linux 和绝大部分的UNIX 都可以使用Bash。作为系统与用户之间的交互接口,shell几乎是你在UNIX 工作...
  • bash-it:社区Bash框架

    2021-01-30 17:56:45
    bash-it:社区Bash框架
  • Bash脚本教程之set命令

    千次阅读 2020-07-09 21:47:39
    Bash 的错误处理 set -e set -o pipefail 其他参数 set 命令总结 shopt 命令 set命令是 Bash 脚本的重要环节,却常常被忽视,导致脚本的安全性和可维护性出问题。本章介绍set的基本用法,帮助你写出更安全的 ...
  • Shellharden 是一款用于高亮显示 bash 语法的工具,还可以提示和修正对于变量的合适引用
  • bash和zsh区别Most Linux distributions include thebashshell by default, but you couldalso switch to another shell environment. Zshis a particularly popular alternative, and there are other shells, lik....
  • bash命令补全工具bash-completion

    千次阅读 2020-11-01 23:57:08
    什么是shell ? 简单点理解,就是系统跟计算机硬件交互时使用的中间介质,它只是系统的一个工具。实际上,在shell和计算机硬件之间还有一层东西那就是系统内核了。...bash是 linux环境下面的命令行终端,对于命令和..
  • windows执行bash脚本

    千次阅读 2022-03-22 19:10:01
    Windows执行shell脚本 1、 安装Git 2、 查看Git环境变量 右击电脑-属性-高级-高级系统设置 已设置环境变量 3、 打开Git bash 定位到sh文件所在目录,直接使用bash 或sh 来执行bash shell脚本:
  • Shell、Bash、Zsh这都是啥啊

    千次阅读 2022-02-04 14:05:04
    一文了解Shell、Bash、Zsh
  • bash 调用python文件

    千次阅读 2022-01-26 14:29:08
    # print('argv1', argv[1]) input() # /bin/bash # shell调用python脚本,并且向python脚本传递参数 a=100 b="ZhongGuo" python pytest.py $a $b # 使用shell调用python中的函数 python -c 'import pytest;...
  • linux bash简介

    千次阅读 2021-05-14 12:27:05
    linux bash是一种shell,还有很多其他的shell。那么什么是shell1. 什么是shell电脑是一堆硬件组成的(cpu,硬盘,内存条等),操作系统内核(kernel)管理这些硬件。用户不能直接接触操作系统内核(因为很复杂,也很危险)...
  • 关于#!/bin/bash

    千次阅读 2020-08-14 15:12:31
    /bin/bash是指此脚本使用/bin/bash来解释执行。 其中,#!是一个特殊的表示符,其后,跟着解释此脚本的shell路径。 bash只是shell的一种,还有很多其它shell,如:sh,csh,ksh,tcsh,... 我们可以通过以下一个示例来...
  • linux退出bash_Linux Bash退出和退出代码

    千次阅读 2020-10-07 02:55:30
    linux退出bashLinux bash shell provide simple but useful programming environment. We can write simple applications, scripts which will run commands, redirect input and outputs and create, stop process....
  • linux bash命令怎么用?微软在win10一周年更新预览版中加入了ubuntu bash命令支持,但是很多用户并不知道怎么使用。今天U大侠小编就针对这个问题给大家介绍下win10系统linux bash命令使用教程。win10版linux bash命令...
  • 作为一名运维工程师,BashShell脚本编写必不可少。然而,大家会发现专门用来编写BashShell脚本的IDE少之又少。但是,即使这样也阻止不了我们自己通过vim来打造一款属于自己的BashShell脚本开发环境。通过以下命令及...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,174,066
精华内容 1,269,626
关键字:

bash

友情链接: 新建文件夹.zip