shell脚本学习1-基本操作

        最近开始系统学习shell脚本的相关知识,为了对已经学习的知识及时巩固,也为别人提供参考的资料,这里会对自己的学习过程做详细的记录。

        本次主要介绍shell脚本的相关概念和基本操作。

1. 创建和运行shell脚本

        一般使用vi或者vim来创建并编辑一个shell脚本,如输入vi test1.sh创建一个test1.sh的脚本并等待输入。shell脚本以井号(#)为注释符号,但是shell脚本的第一行一般会在井号后面加上感叹号(#!)的形式来指定这个shell脚本会以用哪一种shell来运行这个脚本,因为可以运行shell的是有很多的。比如在test1.sh的第一行写上#!/bin/bash就是以/bin/bash这个可执行文件来加载test1.sh这个脚本。test1.sh脚本如下

#!/bin/bash

#This is first script to print hello world

echo "hello world"

好了!现在第一个脚本已经准备好了,那么运行一下它。运行之前,要给这个文件一个可执行权限。输入:

chmod u+x test1.sh

现在脚本有可执行权限了,可以运行了,输入:

./test1.sh

运行后会输出:

hello world

注意上面的echo指令在hello world前后加了双引号,其实不加或者加上单引号’hello world’也可以。但是当字符串本身就有单引号/双引号的时候,那么就必须加上双引号/单引号包进来,比如输入:

echo "It's a dog"

echo 'He says "This is good"'

输出:

It's a dog

He says "This is good"

2. 环境变量和用户变量


2.1 环境变量

可以通过set命令来查看当前环境变量,输入set|more 来分页显示结果。

set|more

输出

BASH=/bin/bash

BASHOPTS=checkwinsize:cmdhist:complete_fullquote:expand_aliases:extglob:extquote:force_fignore:histap

pend:interactive_comments:progcomp:promptvars:sourcepath

通过在环境变量名的前面加上美元符号$可以把该变量的内容取出来,建立test2.sh脚本并输入:

#!/bin/bash

# print environment parameter

echo -n "UID is "

echo $UID

echo -n "HOME is "

echo $HOME

输出:

UID is 1000

HOME is /home/aitian

注意:上面的美元符号是取出环境变量的对应的值,所以如果不加上美元符号,那么输出的就是变量名本身了。如果字符串本身就有一个美元符号的话,那么可以加上转义反斜线(\),比如输入

echo “this paper cost is \$2”

输出:

echo “this paper cost is $2”

2.2 用户变量

用户能够定义自己的变量来临时存储一些数据,对用户变量赋值的时候用等于号(=),例如

var=-40

注意:等号左右两侧不能出现空格,否则会报错,例如

var = -40

运行时会报错 ,var: 未找到命令。

用户变量的值会根据赋值数据自动决定变量类型,用户变量也可以通过美元符号取值。和C语言不一样的是,用户变量在整个shell的运行阶段都是有效的,在运行结束的时候会释放。建立test3.sh如下

#!/bin/bash

var_num=100

var_str="wulinwaizhuan"

echo "var_num is $var_num var_str is $var_str"

var_num=-100

var_str="baizhantang"

echo "var_num is $var_num var_str is $var_str"

输出:

var_num is 100 var_str is wulinwaizhuan

var_num is -100 var_str is baizhantang

注意:如果要将一个用户变量的值赋给另一个用户变量,也要用美元符号,例如建立test4.sh

#!/bin/bash

var1="wulinwaizhuan"

var2=$var1

var3=var1

echo "var2 is $var2,var3 is $var3"

输出:

var2 is wulinwaizhuan,var3 is var1

3. 命令替换

有时候需要将一条指令的运行结果赋值给一个变量,可以通过两个方法:

(1)在指令的两端加上反引号(`),比如a=`ls`,这个反引号在键盘左上角esc键盘的下一个

(2)通过美元符号加上小括号,比如a=$(ls)

新建test3.sh如下:

#!/bin/bash

a=`ls`

echo $a

a=$(ls $HOME)

echo $a

运行输出:

count_exe.sh isPhone.sh test11.sh test12.sh test19.sh test1.sh test2.sh test3.sh test4.sh test5.sh test.sh test.txt

at examples.desktop GoProject protobuf352 pycharm-community-2018.3.4 QtProject wget-log

4. 输入输出重定向

当前脚本的输入都是通过读取键盘的输入,输出是直接显示到屏幕上。而输入输出重定向能够把输入输出扩展到其他位置,比如从文件中读取或者输出到文件中。

4.1 输入重定向

输入重定向是把文件中的内容输入作为内容,输入给对应的指令。例如输入:

cat < test1.sh

输出:

#!/bin/bash

#This is first shell script to print hello world

echo "hello world"

这就是把test1.sh的内容输入给cat这个指令,cat指令会把对应的输入打印到屏幕上,再举一个例子,输入:

wc < test1.sh

输出:

3 13 80

这三个数字分别代表test1.sh这个文件的行数,单词个数和字节个数

4.2 输出重定向

输出重定向可以把结果写到文件中而非打印到屏幕上,例如输入:

date +%y%m%d > tmp.txt

当tmp不存在的时候会去自动创建这个文本写入,查看tmp.txt中的内容,cat tmp.txt

191201

注意:这里重定向会覆盖原来的内容,如果想要不覆盖,而是在后面追加的话使用符号 >>,例如输入:

ls >> tmp.txt

输出tmp.txt内容,cat tmp.txt:

191201

count_exe.sh

isPhone.sh

5 管道

        通过重定向可以把输入输出重定向到文件中,如果是两个指令之间呢,两个指令之间如果要传输数据的话怎么办呢?当然用重定向间接地以类似于缓冲区的形式传递也是可以的,不过通过管道更加方便。

比如通过管道把ls输出的结果输入到sort排序这个命令中,输入:

ls | sort

输出:

count_exe.sh

isPhone.sh

这里的|就是管道,注意,管道左右两侧的指令并不是说左侧先执行,然后把结果输入到缓冲区然后右侧的指令再从缓冲区里面去读取。管道并不存在缓冲区,左侧指令一有结果右侧指令立即就有输入。

6 数学操作

        数学上的加减乘除等shell脚本也能运行,shell提供两个方法执行数学运算:expr和方括号

6.1 expr命令

        例如输入:

expr 2 -5

输出:

-3

但是expr有一个缺点导致她并不常用,expr不会自动去转义一些特殊符号,比如乘法符号*,输入:

expr 3 * 5

输出:

expr: 语法错误

加上反斜线可以解决这个问题,输入:

expr 3 \* 5

输出:

15

6.2 方括号

        通过美元符号加中括号把数学表达书框起来的形式也能够完成数学运算,并且这种方式不需要转义,使用更加方便,建议以后使用这个方式,例如输入:

#!/bin/bash

var1=3

var2=$[3 + 3]

var3=$[$var1 + $var2]

var4=$[$var3 * 2]

var5=$[2 * ($var3 - $var4)]

echo "var1=$var1,var2=$var2,var3=$var3,var4=$var4,var5=$var5"

var6=$[100 / 30]

echo "var6=$var6"

输出:

var1=3,var2=6,var3=9,var4=18,var5=-18

var6=3

可以看出var1~var5都计算没问题,但是var6结果并不精确。这是因为shell只能支持整数运算。如果想要在shell中使用小数运算的话可以使用bc命令。

7. 查看指令退出的状态码和退出shell

7.1 查看指令退出的状态码

        类似于C语言的函数返回值,其实每一个指令都会有一个返回的状态码,上一条指令结束之后会返回一个0~255范围内的整数,当前指令可以获取该返回码的值,一般成功退出都会返回0,查询方式是读取$?的值。

例如输入:

date

echo $?

输出:

0

输入:

abcdef

echo $?

输出

127

这里的127代表无效指令的返回值。

7.2 退出shell

        当我们shell脚本运行结束后,shell脚本带的返回码就是最后一条指令的返回码。不过可以exit指令来指定返回码。例如在shell脚本中输入:

#!/bin/bash

date

exit 4

然后在终端执行该脚本并打印$?值:

输入:

./test8.sh

输出:

2019年 12月 01日 星期日 22:54:10 CST

输入:

echo $?

输出:

4

8 总结与展望

8.1总结

(1)如何创建并运行一个shell脚本,包括shell的第一行和注释;

(2) shell如何读取环境变量,定义用户变量,用美元符号$取值;

  (3)  命令替换,用反引号或者$()实现命令替换;

  (4)    输入输出重定向,用符号<实现输入重定向,符号>实现输出重定向

  (5)    通过管道实现命令之间的重定向

(6)  数学运算,通过expr或者$[]的形式实现数学运算,不过expr不太好用

(7) 命令的状态码,用$?查看上一条命令的状态码,用exit 可以指定shell的返回状态码

8.2 展望

下次更新将学习使用shell中的条件判断语句怎么写,也就是if then,以及case语句。

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

推荐阅读更多精彩内容

  • 第 2 章 SHELL 基础知识2.1 shell脚本我们在上面简单介绍了一下什么是shell脚本,现在我们来进一...
    LiWei_9e4b阅读 1,553评论 0 0
  • 一、shell脚本介绍 1.1 开头(环境使用shebang机制) #!/bin/bash 必须写在文件首行 符号...
    优果馥斯阅读 3,270评论 0 1
  • 建立一个脚本 Linux中有好多中不同的shell,但是通常我们使用bash (bourne again shel...
    某人在阅读 2,001评论 0 0
  • 一,shell题记 不懂shell的程序员不是好程序员,学习shell是为了自动化,使用自动化可以非常有效的提高工...
    架构师小秘圈阅读 8,720评论 3 70
  • 基础命令 主要的命令和快捷键 Linux系统命令由三部分组成:cmd + [options]+[operation...
    485b1aca799e阅读 1,085评论 0 0