Shell脚本快速入门(1)

Shell 是一个用 C 语言编写的程序,用户可以通过Shell脚本语言来进行程序开发。与其他脚本语言不同,Shell脚本所需的解释器一般是内置在操作系统的,而像Node.js、PHP等脚本语言需要手动安装解释器程序才可以。

接下来将和大家一起来学习Shell脚本编程。

Shell解释器

Shell解释器种类众多,笔者的电脑上内置以下Shell:

/bin/bash
/bin/csh
/bin/ksh
/bin/sh
/bin/tcsh
/bin/zsh

其中bash和sh是最常见的Shell解释器,一般情况下,这两种Shell没有区别,本文以bash为例。

Hello World

打开文本编辑器(vim或者vscode),新建文件 hello.sh,扩展名为sh(常用)。

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

第1行用来指明本脚本需要使用什么解释器来执行。#!是一个约定的语法。

echo用来输出文本。

执行Shell脚本

有两种方法可以执行Shell脚本:

  1. 作为可执行程序。给脚本添加可执行权限之后执行即可。

    chmod +x ./hello.sh # 添加可执行权限
    ./hello.sh # 执行脚本
    
  2. 作为解释器脚本。直接运行指定的解释器程序,并将脚本路径传入,本方式不要求脚本有可执行权限。

    /bin/bash hello.sh # 使用/bin/bash来执行hello.sh
    

Shell语法

和其他编程语言一样,Shell脚本也有自己的一套语法规则,我们现在来系统学习一下。

变量

命名规则

定义变量时,变量名不加美元符号$,如:

name="xialei"

和其他编程语言不同的时,Shell脚本中变量名和等号之间不能有空格。Shell变量名的命名规则如下:

  • 只能包含英文字母、数字和下划线,且不能以数字开头
  • 不能包含空格
  • 不能使用关键字命名(通过下划线连接关键字是允许的)
  • 不能使用标点符号

以下是合法的示例

var1
var_2
_var3
MAX_PAGE

以下是不合法的示例

$var

赋值

Shell有以下两种复制方式。

  1. 直接赋值。直接在等号后面指定变量值。

    name="xialei
    admin=1
    
  2. 使用命名执行结果。可以将其他命令的执行结果赋值给变量。(以下两种方式是等效的)

    file=`ls /etc` # 反引号(键盘Tab上面的键)
    file1=$(ls /etc)
    

已经存在的变量,可以被重新赋值。

name="hello"
echo $name

name="world"
echo $name

使用变量

使用变量时在变量名前添加$符号,定义时不加。

name="xialei"
echo $name
echo ${name}

变量名两边的花括号是可选的,一般情况下不用加,但是如果涉及到边界识别问题,则需要手动添加花括号。

name="xialei"
echo "I'm ${name}studio." # 正确示例
echo "I'm $namestudio." # 错误示例

如果不添加花括号,Shell会将namestudio作为变量,该变量是不存在的,因此代码执行逻辑就不是我们想要的了。

只读变量

如果某些变量在定义后就无法更改该变量的值,可以设置使用readonly设置为只读变量,对只读变量赋值会跑出错误。

name="xialei"
readonly name
name="zhangsan"

上述例子执行结果如下

./hello.sh: line 5: name: readonly variable

释放变量

使用unset可以释放变量。变量被释放后不能使用(使用不会报错,shell中使用未定义变量当做空值处理),此外unset命令无法释放只读变量。

name="xialei"
unset name # 不要$
echo $name

变量类型

Shell脚本运行时,存在以下三种变量:

  • 局部变量。在脚本中定义的变量,只对当前脚本有效
  • 环境变量。所有程序都能访问到环境变量,此外Shell脚本也可以在运行时定义环境变量
  • Shell变量。Shell变量是由Shell解释器设置的变量。Shell变量中有一部分是局部变量,有一部分是环境变量。

数据类型

Shell支持数字、字符串和数组三种数据类型。下面我们分别进行学习。

字符串

字符串可以使用单引号、双引号,也可以不使用引号。

单引号

name='xialei'
  • 单引号内的任何字符都会原样使用,不解析变量,也不解析转义字符。这一点和PHP有点类似

双引号

name='xialei'
msg="Hello, ${name}"
echo $msg
  • 双引号内的字符串会进行变量解析和转义字符解析
字符串拼接

字符串拼接有以下两种方式。

引号拼接(支持双引号和单引号)

name='xialei'
msg='Hello '$name', welcome!'
echo $msg

内部嵌套(只支持双引号,因为单引号不解析变量)

name='xialei'
msg="Hello ${name}, welcome!"
echo $msg

数组

Shell只支持一维数组,不限定数组大小。

数组的索引由0开始,读取元素的索引可以使用整数或表达式。

数组定义

数组元素使用小括号括起来,每个元素之间用空格分割。

users=(xialei zhangsan lisi)
读取数组元素

语法如下:

${数组名称[下标]}

比如上例中读取第2个人

users=(xialei zhangsan lisi)
echo ${users[1]} # 输出zhangsan

使用@作为下标可以获取数组的所有元素。

users=(xialei zhangsan lisi)
echo ${users[@]} # 输出 xialei zhangsan lisi
获取数组长度

语法如下

length=${#数组名[@]}

比如输出users数组的长度

users=(xialei zhangsan lisi)
echo ${#users[@]}

今天的内容主要是让大家对Shell有一个宏观的认识,介绍了Shell的变量以及数据类型,下一篇将重点介绍Shell的运算符和流程控制。

0.jpeg

(未完待续)

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,242评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,769评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,484评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,133评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,007评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,080评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,496评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,190评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,464评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,549评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,330评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,205评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,567评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,889评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,160评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,475评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,650评论 2 335

推荐阅读更多精彩内容

  • 官网 中文版本 好的网站 Content-type: text/htmlBASH Section: User ...
    不排版阅读 4,338评论 0 5
  • 什么是Shell脚本 示例 看个例子吧: !/bin/sh cd ~ mkdir shell_tut cd she...
    码农朱同学阅读 2,497评论 0 5
  • 特别说明:以下内容来自简书,链接为原文出处,一切权益归原作者所有,在此感谢原作者的分享,大家可以点击以下链接查看原...
    沈祥佑阅读 546评论 0 4
  • 用了caffe有一段时间了,感觉自己写shell脚本的能力有待提高,特地从菜鸟笔记处系统的看了一遍,其实学习基础就...
    yichen_china阅读 1,818评论 2 30
  • 概念和原理 Shell是什么? Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。 Sh...
    陵无山阅读 3,520评论 0 27