1-22-shell脚本的基础


时间:2018-06-13 姓名:魏文应


一、shell 的基本格式要求

  • 文件命名:为了容易辨认,我们一般以 .sh 作为文件后缀,比如:test.sh。

  • 指定shell:shell解释器有很多种,其中有一种叫bash,写脚本时,要在开头的地方告诉脚本,使用哪个shell解释器,比如:#! /bin/bash (必须在脚本的最前面,#! 加上 shell 的绝对路径,不写的话会使用系统默认的shell)。

二、shell的执行方式

这里我有一个测试脚本

#!/bin/bash
#author : panda
# change-date:2016-11-05
# --------------------------------------------
########脚本测试开始##############
echo "What is your name?"
read person
echo "Hello, $person" 
sleep 2
date
sleep 2
a="game over"
echo "$person,$a"
##########脚本测试结束###########

假设我这个脚本文件名叫 test.sh,可以使用下面几种方式中的一种,来执行这个test.sh脚本:

  • 使用bash解释器:bash test.sh
  • 使用sh解释器: sh test.sh
  • 赋予可执行权限(chmod u+x test.sh): ./tesh.sh
  • 使用source命令(source是在当前bash环境下,读取并执行FileName中的命令):source test.sh

三、shell 脚本中的变量

  • 变量的赋值:A=hellow (等号之间不能有空格)。

  • 将命令赋值给变量: A=`date` (这时TEST相当于命令date)。

  • 打印变量内容: echo $A

  • 将命令赋值给变量: A=$(ls -l) (echo $A 相当于 ls -l)。

  • 变量传递:

    # 这时相当于B=hellow
    A=hellow
    B=$A
    
  • 利用变量和字符串,组成新的字符串:

    MYDIR=/home/wwy
    echo ${MYDIR}/test
    
  • 给变量赋值多个单词,需要用引号 :

    A="hellow world"
    # 或者用单引号
    A='hellow world'
    
    name=world
    
    # 特殊符号含义保留,下面这句打印结果为:hellow world
    A="hellow $name"
    
    # 单引号就是明面上的意思,下面这句打印结果为:hellow $name 
    A='hellow $name'
    

四、设置永久变量

如果在 /usr/local/test/ 下,有一个可执行文件 test.sh,你想像系统中正常的命令(比如ls、man、cd等)一样使用 test.sh,则在用户的home目录下,打开 vim .bashrc,在后面加入下面语句:

export PATH=/usr/local/test:$PATH

这句话的意思是,将 /usr/local/test 这个目录加入用户环境变量中。这样,/usr/local/test 这个目录下的可执行文件,就可以像正常命令一样使用了。

五、位置变量

shell中,有一种叫位置变量。比如test.sh这个脚本,有下面代码:

#!/bin/bash

# $author:wwy

echo "---------------------"
echo "Shell :";
echo "$0";
echo "$1";
echo "$2";
echo "$1";
echo "$3";

比如,我们使用shell执行 sh test.sh 7 8 9,那么,sh 解释器就认为, test.sh 就是 $0,7就是 $1,8就是 $2,9就是 $3。这就是在命令行外面,传参给脚本。如果是大于9,需要用中括号扩起来 [ ] ,比如 $[10]$[11]$[12]等。

六、特殊变量

符号 参数
$* 以一个单字符串,显示向脚本传递的所有参数
$# 传递到脚本的参数个数
$@ $* 相同,但是使用时加引号,并在引号中返回每个参数,如 "$@"「"」 括起来的情况、以 "$1" "$2" … "$n" 的形式输出所有参数
$$ 这个程序的PID
$? 显示最后命令的退出状态;0表示没有错误,其他任何值表明有错误
$! 上一个后台进程的ID

下面是测试代码:

#!/bin/bash


echo "======================================="
echo '用 $+数字 代表相应的参数:'
echo $1 $2 $3 $4 $5 $6 $7 $8 $9
echo "======================================="
echo

echo "======================================="
echo '用 $0 表示sh的第0个参数,也就是脚本名:'
echo $0
echo "======================================="
echo

echo "======================================="
echo '用 $* 列出所有参数:'
echo $*
echo "======================================="
echo

echo "======================================="
echo '用 $# 统计参数个数: '
echo $#
echo "======================================="
echo

echo "======================================="
echo '用 $@ 列出所有参数(和$*)'
echo "$@"
echo "======================================="
echo

echo "======================================="
echo '用 $? 表示最后一个命令退出时的状态(0表示没有错误):'
echo "$?"
echo "======================================="
echo

echo "======================================="
echo '用 $$ 表示当前进程的PID:'
echo "$$"
echo "======================================="
echo

echo "======================================="
echo '用 $! 表示上一个后台进程ID:'
echo "$!"
echo "======================================="

七、运算符

运算符                 意义
++   --               递增及递减,可前置也可以后置
+  -  ! ~             一元运算的正负号 逻辑与取反
+  —  *  /   %        加减乘除与余数
<   <=   >   >=       比较大小符号
==   !=               相等 不相等
>>  <<                向左位移 向右位移
& ^   |               位的与 位的异或 位的或
&&  ||                逻辑与 逻辑或
? :                  条件判断

++aa++ :比如:

# ++a 是自加,后赋值
# 比如下面这个,a先自加1,再把自加后的a赋值给echo。
# 这时 echo 看到a的值为a=2
a=1
echo $((++a))

# a++是先赋值,后自加
# 比如下面这个,a先把值赋值给echo,这时echo看到a的值为a=1
# 然后a再自加1变成a=2
a=1
echo $((a++))

八、read命令

read : 从键盘读入数据。比如 read a b c ,然后你在键盘输入三个参数,这三个参数分别赋值给a,b,c。

read还可以带参数:

参数 说明 举例
-s 隐藏输入字符,比如输入密码时效果 read –s passwd
-t 设置输入时间,超时自动退出 read –t 2 test
-r 允许输入包含反斜杠 read –r line
-n 限制输入长度 read –n 2 test
-p 打印一些信息 read -p "请输入你的准考证号: " ID

九、expr命令

expr是整数运算命令,返回整数运算结果:

返回相加结果:expr 3 + 5 , 结果为7。
没有空格的情况下,返回过程: expr 3+5 ,结果为 3+5。
乘号需要转义字符:expr 3 \* 5
计算字符串长度:expr length "hellow world"
结果作为输入: expr `expr 5 + 11` / 2

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

推荐阅读更多精彩内容