bash shell 脚本简介

shell 运行环境

如果你运行的是 Unix 或 Linux 系统,例如 Ubuntu,Red Hat,SUSE Linux,还有macOS,都是内置了 bash shell 的,所以你不需要额外配置所谓的开发环境。

我的 shell 环境是 macOS Sierra 版本,如果你用的是其他 Linux 系统,后面的例子基本上都是可以运行的。

首先,打开Terminal 命令行,先检查下你的系统的 shell 版本:

echo $BASH_VERSION

bash 命令层次结构

命令类型

bash shell 内置了一个type命令会根据你输入的单词来显示此命令的类型,主要有以下五种类型:

  • 别名
  • 方法
  • shell 内置命令
  • 关键字
  • 文件

例如,我们经常使用的cd命令,我们来执行下面的命令来看下它属于哪种类型。

type cd

同时,为了查看更加详细的信息,可以使用

type -a cd

如果想查看的信息更加简洁和适合人们理解,可以使用如下命令和参数:

type -t ls

PATH 命令

Linux会检查配置在 PATH 环境中的指定路径的程序是否可以执行。通常情况下,当前目录是不会被查找,除非你把它配置到PATH 中,我们可以执行如下命令,把当前目录加到 PATH 环境中。

export PATH=$PATH:.

接下来,我们创建一个存放 shell 脚本的目录bin,可以用如下命令来执行:

$ test -d $HOME/bin || mkdir $HOME/bin

当然你可以在你的主目录下手动创建目录 bin。上面的意思是检查主目录是否有 bin 目录,没有则创建。

创建脚本

没啥说的,学习每一种语言的第一个程序就是“Hello,World”,文件名叫 hello1.sh。

#! /bin/bash
echo "Hello World"
exit 0

解释一下:

#!/bin/bash:通常情况下,脚本的默认第一行代码就是它。“#!”又被成为shebang。它用来告诉系统的解释器来执行脚本。除了 bash,我们还可以PHP,Perl等其他脚本。

echo "Hello World":echo 是一个内置的命令,用来表示标准输出,类似于 Java 中的System.out.println()

exit 0:表示脚本结束退出,exit有一个整型参数,0表示正常退出,非0表示脚本执行中有错误。

执行脚本

现在,我们来执行上面的脚本,你可以在命令行下,进入到脚本文件存在的目录,也可以是在任意目录下,但是,在执行的时候,文件的路径就应该为绝对路径:

bash $HOME/bin/hello1.sh

执行结果为,打印出“Hello world”。

Tip

在执行上面的命令中,可能会报错,提示权限不足或访问拒绝的错误。这是因为 hello1.sh 没有执行的权限。所以我们使用如下命令给文件加上对应的权限。

chmod +x $HOME/bin/hello1.sh

脚本中的一些特殊参数

在脚本中,有些表示特殊含义的参数,下面列出常见的几个:

参数标识符 含义
$0 文件本身的名字
$1 表示位置的参数,第一个参数传递给脚本
${10} 在超过两位数的参数时,使用大括号限定起来
$# 参数的个数
$* 表示所有的参数

如下所示:

#! /bin/bash
echo "file name $(basename $0)"
echo "Hello $1"
echo "Hello $*"
echo "Args count: $#"
exit 0

输出的结果为:

重视引号的正确使用

到现在,我们使用了双引号来包围字符串用于 echo 命令的输出。

在第一个 Hello1.sh中,使用单引号还是双引号,效果是一样的。下面的两行代码是等效的。

echo "Hello World"
echo 'Hello World'

但是,在包含有变量的引用时,单引号和双引号的效果是不一样的。

echo "Hello $1" // 打印传递的值,例如 Tim。
echo 'Hello $1' // 把$1原样打印出来

所以,在有变量的字符串里,推荐使用双引号。这时,$1就会被变量的值所替代,而不是作为字符串显示出来。

打印脚本名字

前面提到过,特殊参数$0用来表示脚本的名字,这里的名字会带有完整的路径,如果我们只想要文件名的话,可以使用以下代码:

echo "You are using $(basename $0)"

这里\((….)语法的作用是我们先执行括号里面的命令,然后然后把结果赋给外面不知名的变量。
\)(….)语法还有一种相等的写法,注意,是键盘上数字1左边的按键,不是单引号。

echo "You are using `basename $0`"

个人不推荐这种写法,太容易混淆,不容易差错。

调试你的脚本

如果想调试你的脚本,bash给我们提供了两个选项:-v 和-x。

如果我们想逐行详细地查看脚本的内容,可以使用-v 选项。

#! /bin/bash
echo "file name $(basename $0)"
echo "Hello $1"
echo "Hello $*"
echo "Args count: $#"
exit 0

更常用的是-x 选项,它们在执行时显示命令。当我们决定选择分支的时候,更加使用。



可以看到,basename最先执行了,使用此选项不会看到代码的详情。

Linux Shell——bash shell 脚本简介的更多相关文章

  1. CMD & Git Shell & Bash Shell

    CMD & Git Shell & Bash Shell https://mvdan.cc/sh/cmd/shfmt PC

  2. Linux的Bash Shell详解

    一.Bash Shell概述 1.什么是bash         bash是Bourne Again Shell的简称,是从unix系统中的sh发展而来的,是用户和Linux内核交互的工具,用户通过b ...

  3. ubantu linux的bash shell初接触

    本人是Linux初习者,同时也刚刚开始学习,将我的学习成长记录下来,来和大家一同分享! 我用的系统是Ubuntu 12.04,脚本编辑器用的是VIM,觉得很顺手!Shell语言用的是Bash Shel ...

  4. Linux下Bash shell学习笔记

    原文地址: http://www.cnblogs.com/NickQ/p/8870423.html 1.shell下没有变量类型和定义的概念. 变量直接使用不用定义 所有值都视为字符串. 在对变量取值 ...

  5. linux之bash shell

    GNU bash ======================================================== 通常计算机硬件是由运算器.控制器.存储器.输入/输出设备等等这些物理 ...

  6. 【Linux】bash shell学习

    Bash Shell Linux系统的合法shell都写入/etc/shells这个文件,默认使用的shell版本称为“Bourne Again Shell(简称bash)” 用户登录时系统会分配一个 ...

  7. 如何在Windows 10安装和使用Linux的Bash shell

    转载自:百度经验 Windwos 10 的周年更新为开发人员提供一个大的新功能:一个完整的,基于Ubuntu的Bash shell中,可以直接在Windows上运行Linux软件. 这使得“Linux ...

  8. Shell,Bash,等脚本学习(有区别)

    二元比较操作符,比较变量或者比较数字.注意数字与字符串的区别.   整数比较   -eq        等于,如:if [ "$a" -eq "$b" ] -n ...

  9. linux 10 -Bash Shell编程

    二十三. Bash Shell编程:     1.  读取用户变量:     read命令是用于从终端或者文件中读取输入的内建命令,read命令读取整行输入,每行末尾的换行符不被读入.在read命令后 ...

随机推荐

  1. 1572: [Usaco2009 Open]工作安排Job

    1572: [Usaco2009 Open]工作安排Job Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 814  Solved: 365[Submit ...

  2. 算法模板——LCA(最近公共祖先)

    实现的功能如下——在一个N个点的无环图中,共有N-1条边,M个访问中每次询问两个点的距离 原理——既然N个点,N-1条边,则说明这是一棵树,而且联通.所以以1为根节点DFS建树,然后通过求两点的LCA ...

  3. mp4文件格式解析

    目前MP4的概念被炒得很火,也很乱.最开始MP4指的是音频(MP3的升级版),即MPEG-2 AAC标准.随后MP4概念被转移到视频上,对应的是MPEG-4标准.而现在我们流行的叫法,多半是指能播放M ...

  4. js数据类型:引用和5种基本数据类型

    javascript有2种基本数据类型:引用和基本数据类型 基本数据类型又有5个分类:布尔型.字符串.数值.undefined.NULL.

  5. javascript-基本数据类型和转换

    ECMAScript中有5种基本数据类型:Undefined.Null.Boolean.Number.String.还有1种复杂数据类型-Object,Object实质上是由一组无序的名值对(键值对) ...

  6. Git-最简单的本地项目变成版本仓库,然后把内容推送到GitHub仓库

    (注:本文的前提是本地Git仓库和github仓库之间已经存在SSH key了,所以如果没有建立联系的小伙伴们请先建立联系) 具体操作: 一:把本地项目变成版本仓库 1.把本地的一个项目目录编程版本库 ...

  7. 有个程序猿要去当CEO了:(二)扬帆起航

    合同签好了. 从昨天下午三点半,一直修改到晚上七点半,才确定签下. 这过程中,有一点讨论得比较久: 就是甲方要不要也拿底薪. 甲方是这样说的:"总经理拿N仟元,董事长不要说比总经理高,但是也 ...

  8. JS中的普通函数和箭头函数

    最近被问到了一个问题: >javaScript 中的箭头函数 (=>) 和普通函数 (function) 有什么区别? 我当时想的就是:这个问题很简单啊~(flag),然后做出了错误的回答 ...

  9. 配置远程服务器,使hyper-v能够连接网络

    一般远程服务器只有一个网卡和IP,如果你要在服务器上装虚拟机,那么要使虚拟机能够连接网络,必须要创建虚拟交换机. 如果创建虚拟交换机并桥接,那么就会改变IP地址,改变IP地址,就连接不上远程服务器.造 ...

  10. HTML学习笔记汇总

    笔记几乎涵盖了日常开发中全部的知识点以及相关注意事项 想要学习网页制作的初学者可以通过本篇笔记初步掌握HTML的使用,也可以将该笔记作为查阅资料查看 HTML简单结构 <html> < ...