Linux Shell——bash shell 脚本简介
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 脚本简介的更多相关文章
- CMD & Git Shell & Bash Shell
CMD & Git Shell & Bash Shell https://mvdan.cc/sh/cmd/shfmt PC
- Linux的Bash Shell详解
一.Bash Shell概述 1.什么是bash bash是Bourne Again Shell的简称,是从unix系统中的sh发展而来的,是用户和Linux内核交互的工具,用户通过b ...
- ubantu linux的bash shell初接触
本人是Linux初习者,同时也刚刚开始学习,将我的学习成长记录下来,来和大家一同分享! 我用的系统是Ubuntu 12.04,脚本编辑器用的是VIM,觉得很顺手!Shell语言用的是Bash Shel ...
- Linux下Bash shell学习笔记
原文地址: http://www.cnblogs.com/NickQ/p/8870423.html 1.shell下没有变量类型和定义的概念. 变量直接使用不用定义 所有值都视为字符串. 在对变量取值 ...
- linux之bash shell
GNU bash ======================================================== 通常计算机硬件是由运算器.控制器.存储器.输入/输出设备等等这些物理 ...
- 【Linux】bash shell学习
Bash Shell Linux系统的合法shell都写入/etc/shells这个文件,默认使用的shell版本称为“Bourne Again Shell(简称bash)” 用户登录时系统会分配一个 ...
- 如何在Windows 10安装和使用Linux的Bash shell
转载自:百度经验 Windwos 10 的周年更新为开发人员提供一个大的新功能:一个完整的,基于Ubuntu的Bash shell中,可以直接在Windows上运行Linux软件. 这使得“Linux ...
- Shell,Bash,等脚本学习(有区别)
二元比较操作符,比较变量或者比较数字.注意数字与字符串的区别. 整数比较 -eq 等于,如:if [ "$a" -eq "$b" ] -n ...
- linux 10 -Bash Shell编程
二十三. Bash Shell编程: 1. 读取用户变量: read命令是用于从终端或者文件中读取输入的内建命令,read命令读取整行输入,每行末尾的换行符不被读入.在read命令后 ...
随机推荐
- Yii2.0修改默认控制器
设置默认控制器有两种方法 1.在/vendor/yiisoft/yii2/web/Application.PHP的第28行左右 public $defaultRoute = 'site'; ...
- wp8数据存储--独立存储文件 【转】
出自 : http://www.cnblogs.com/MyBeN/p/3339019.html 文章篇幅有点大,建议去源网看看 1.调用手机的独立存储 例如:IsolatedStorageFile ...
- 【转】nginx配置:location配置方法及实例详解
location匹配的是nginx的哪个变量? $request_uri location的匹配种类有哪些? 格式 location [ 空格 | = | ~ | ~* | !~ | !~* ] /u ...
- HibernateSessionFactory类的主要方法
package com.app.www.hibernate; import java.sql.SQLException; import org.hibernate.HibernateException ...
- C++标准库之vector(各函数及其使用全)
原创作品,转载请注明出处:http://www.cnblogs.com/shrimp-can/p/5280566.html iterator类型: iterator:到value_type的访问,va ...
- 用Java实现将多级文件夹下的所有文件统一放到一个文件夹中
每次下了电影(男生懂得呦),每部电影都放在一个单独的文件夹里,看的时候很是不方便啊,一直重复着进入文件夹.后退,再进.再退的操作,而手动把这些电影全部复制出来又太繁琐.因此为了解决这个问题,用IO写了 ...
- PHP获得文件创建、修改、访问时间 filectime() filemtime() fileatime()
转载博客 零度_PHP的博客 http://blog.sina.com.cn/s/blog_8edc37a801016hk1.html PHP获得文件创建.修改.访问时间 PHP filectim ...
- 【转】FLEX中SharedObject介绍及应用
ShareObject介绍: 1 ShareObject,顾名思义共享对象,而通常意义上的共享,从B/S结构上来讲,无非是客户端(浏览器端)的共享和服务器端的共享了,不错,ShareObject刚好份 ...
- 【转】JS判断SWF,JPG加载完毕、兼容(Activex,plugIn)所有浏览器
JS判断SWF,JPG加载完毕.兼容(Activex,plugIn)所有浏览器 这里主要说下监听SWF的加载. 网上流传已久的监听方法,只能在IE(Activex插件下)下实现.在使用plugin的浏 ...
- JavaWeb之cookie
什么叫做会话 ? 用户从打开一个浏览器开始,浏览器网站,到关闭浏览器的整个过程叫做一次会话! 每个用户与服务器进行交互的过程中,各自会有一些数据,程序要想办法保存每个用户的数据. 例如:用户点击超链接 ...