Linux --shell基础

本文是整理老师ppt中有关shell编程的部分内容。
需要下载ppt查看的请移步:

https://download.csdn.net/download/ayangann915/11114322

文章目录

  • shell基础
    • 变量
      • 基础知识
        • 本地变量
        • readonly命令
        • read命令
        • 显示本地变量
        • 释放本地变量
        • 环境变量
        • 常见的环境变量
        • PS1变量的特殊符号
        • PATH变量
        • export命令
        • 特殊变量
        • 常见的几个特殊变量
        • shift命令
      • 特殊符号
        • 引用符号
        • 三种引用符号
        • 转义符“\”
        • 单引号“’”
        • 双引号“””
        • 命令替换符“ ` ”
      • 变量表达式
        • test使用情况
        • 字符串比较
        • 数字比较
        • 文件操作
        • 逻辑测试
      • Shell流程控制语句
        • 条件判断
          • if条件语句
          • case条件语句
        • 循环控制
          • for语句循环
          • while循环语句
          • until循环语句
        • break和continue语句
      • here文本
      • 函数
        • 在脚本中定义使用函数

shell基础

变量

基础知识

  • 使⽤变量可以保存有⽤信息,⽤户也可使⽤变量改变 ⾃身的⼯作环境。
  • 按照变量的作⽤来分,可以分为:本地变量 环境变量 特殊变量
  • 调⽤变量时则应在变量名前加⼀个美元符号($)
  • 使⽤set命令可以查看所有的本地变量和环境变量。

本地变量

本地变量,也称为⽤户⾃定义变量,是在当前shell环境,当前进程内有效的变量。

当⽤户注销,或者启⽤⼦shell、⼦进程时该变量不起作⽤

**定义本地变量:**变量名=变量值

注意:

  • 变量与变量值以等号“=”来连接。

  • 等号两边不能直接接空格。

  • 变量名称只能是英⽂字⺟、下划线与数字, 但数字不能是开头字符。

  • 若有空格,可以使⽤双引号或单引号将变量内容结合起来。

  • ⽤户也可以在命令⾏上同时对多个变 量赋值,赋值语句之间⽤空格分开

  • 注意:变量赋值是从左到右进⾏的。

    x=10 y=$x. 执⾏命令后,y的值也是10。

appledeMacBook-Pro:~ apple$ s1=hello
appledeMacBook-Pro:~ apple$ s2="hello word"
appledeMacBook-Pro:~ apple$ echo $s1
hello
appledeMacBook-Pro:~ apple$ echo $s2
hello word
appledeMacBook-Pro:~ apple$ x=4 y=5
appledeMacBook-Pro:~ apple$ echo $x $y
4 5
appledeMacBook-Pro:~ apple$ x=10 y=$x
appledeMacBook-Pro:~ apple$ echo $x $y
10 10

readonly命令

有时需要在说明⼀个变量并对它设置为⼀个特定 值后就不再改变它的值时,可以⽤下⾯的命令来保 证⼀个变量的只读性。

appledeMacBook-Pro:~ apple$ readonly x=10
appledeMacBook-Pro:~ apple$ y=20 x=$y
-bash: x: readonly variable #显示其只读性
appledeMacBook-Pro:~ apple$ echo $y $x
20 10

read命令

语法:read [-pt] 变量名

功能:读取来⾃键盘输⼊的变量。 可选项:

-p:后⾯可以接提示信息

-t:后⾯可以接等待的秒数。为了防⽌⼀直 等待⽤户。

例1:让⽤户通过键盘输⼊内容,将该内容变成atest变量

appledeMacBook-Pro:~ apple$ read atest
this is a test
appledeMacBook-Pro:~ apple$ echo $atest
this is a test

例2:提示⽤户30秒内输⼊⾃⼰的名字,将该输⼊字符串 做成named变量。

appledeMacBook-Pro:~ apple$ read -p"enter your name:" -t 30 name
enter your name:ann
appledeMacBook-Pro:~ apple$ echo $name
ann

显示本地变量

变量的显示使⽤echo命令,格式如下: echo $变量名

​ echo ${变量名}

例1:

appledeMacBook-Pro:~ apple$ num=2

#这并不会打印出“this is the 2nd”,⽽仅仅打印“this is the ”, 因为shell会去搜索变量numnd的值,但是这个变量是没有值的。
appledeMacBook-Pro:~ apple$ echo "this is the $numnd"
this is the 

#可以使⽤花括号来告诉shell我们要打印的是num变量
appledeMacBook-Pro:~ apple$ echo "this is ths ${num}nd"
this is ths 2nd

例2:要将name的内容多出“yes”

#方法一
appledeMacBook-Pro:~ apple$ name=${name}yes
appledeMacBook-Pro:~ apple$ echo $name
annyes
#方法二
appledeMacBook-Pro:~ apple$ name="$name"yes
appledeMacBook-Pro:~ apple$ echo $name
annyesyes

例3:在⼦Shell下变量的作⽤范围

appledeMacBook-Pro:~ apple$ a=11
appledeMacBook-Pro:~ apple$ bash
bash-3.2$ echo $a

bash-3.2$ a=22
bash-3.2$ echo $a
22
bash-3.2$ exit
exit
appledeMacBook-Pro:~ apple$ echo $a
11

释放本地变量

释放本地变量时使⽤unset 命令

appledeMacBook-Pro:~ apple$ name="ann"
appledeMacBook-Pro:~ apple$ echo $name
ann
appledeMacBook-Pro:~ apple$ unset name
appledeMacBook-Pro:~ apple$ echo $name

appledeMacBook-Pro:~ apple$ 

环境变量

环境变量,也称为系统变量。它与本地变量的差 别在于,可以⽤于所有⽤户进程。也就是可以将其 值传送给Shell运⾏的其他命令或脚本使⽤。

这些环境变量在shell开始执⾏的时候就已经定义 了,⽤户还可以重新定义这些变量。

使⽤env命令查看当前系统中定义的环境变量。

常见的环境变量

Linux --shell基础_第1张图片

PS1变量的特殊符号

PS1=‘[\u@\h \W]$ ’

\u:当前⽤户的账号名称

\h:仅取主机名的第⼀个名字

\W:⼯作⽬录名称,仅列出最后⼀个⽬录名

$: 提示符,如果是root时,提示符为#,否则就是$

PATH变量

$PATH:决定了shell将到哪些⽬录中寻找命令或程序,PATH的值是⼀系列⽬录,当您运⾏⼀个 程序时,Linux在这些⽬录下进⾏搜寻所执⾏的 程序。 可以通过修改PATH的值来改变命令的搜寻⽬ 录。

export命令

⽤export命令,可以把本地变量设置为环境变量,

格式为: export 变量名

也可以在给变量赋值的同时使⽤export 命令,

格式为: export 变量名=变量值(若等号两边有空 格,则必须使⽤引号括起来)

例:将n1设为环境变量

appledeMacBook-Pro:~ apple$ n1=11 n2=22
appledeMacBook-Pro:~ apple$ echo $n1 $n2
11 22
appledeMacBook-Pro:~ apple$ export n1
appledeMacBook-Pro:~ apple$ bash
bash-3.2$ echo $n1
11
bash-3.2$ echo $n2

bash-3.2$ exit
exit

查询环境变量:

appledeMacBook-Pro:~ apple$ env
TERM_PROGRAM=Apple_Terminal
SHELL=/bin/bash
TERM=xterm-256color
TMPDIR=/var/folders/pn/j3zy5vyd20v6mkl0xlhjqqz00000gn/T/
Apple_PubSub_Socket_Render=/private/tmp/com.apple.launchd.MuDxxgeqwl/Render
TERM_PROGRAM_VERSION=404
TERM_SESSION_ID=E0D77A81-B3EE-4C36-A232-8CE611F99FAF
USER=apple
SSH_AUTH_SOCK=/private/tmp/com.apple.launchd.dbe8JLEFWS/Listeners
n1=11
PATH=/anaconda3/bin:/Library/Frameworks/Python.framework/Versions/3.5/bin:/Library/Frameworks/Python.framework/Versions/3.6/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Library/TeX/texbin
PWD=/Users/apple
LANG=zh_CN.UTF-8
XPC_FLAGS=0x0
XPC_SERVICE_NAME=0
SHLVL=1
HOME=/Users/apple
LOGNAME=apple
_=/usr/bin/env
appledeMacBook-Pro:~ apple$ 

可以看到,环境变量多了一个n1=11

特殊变量

某些变量在⼀开始执⾏脚本时就被设定且不再改变,它们被称为特殊变量

⽤户只能根据shell的定义来使⽤这些变 量,⽽不能重新定义它们

所有的特殊变量都是由$和另⼀个符号组成的

常见的几个特殊变量

Linux --shell基础_第2张图片

例1:

例2:设计脚本abc如下:

#!/bin/bash 
cal 1 $1
cal 2 $1 
cal 3 $1

运行:显示2020年的前三个月份

appledeMacBook-Pro:~ apple$ bash abc.sh 2020
      一月 2020         
日 一 二 三 四 五 六  
          1  2  3  4  
 5  6  7  8  9 10 11  
12 13 14 15 16 17 18  
19 20 21 22 23 24 25  
26 27 28 29 30 31     
                      
      二月 2020         
日 一 二 三 四 五 六  
                   1  
 2  3  4  5  6  7  8  
 9 10 11 12 13 14 15  
16 17 18 19 20 21 22  
23 24 25 26 27 28 29  
                      
      三月 2020         
日 一 二 三 四 五 六  
 1  2  3  4  5  6  7  
 8  9 10 11 12 13 14  
15 16 17 18 19 20 21  
22 23 24 25 26 27 28  
29 30 31         

shift命令

命令shift可以移动命令⾏参数。运⾏shift后,把每个 命令⾏参数向左移动⼀个位置,即$2$3…依次变 为$1$2…,原先的$1将被丢掉。

例:shell脚本shf内容如下:

#!/bin/bash 
echo $1 $2 
shift
echo $1 $2

运行:

appledeMacBook-Pro:~ apple$ bash shf.sh hi hello bye
hi hello
hello bye

特殊符号

引用符号

在bash中,许多字符有特殊的含义。如果希 望bash忽略某些字符的特殊含义,可以使⽤⼀ 种称为“引⽤”的技术,通知Shell暂时忽略被引 ⽤字符的特殊含义,将其作为普通字符处理

Linux --shell基础_第3张图片

三种引用符号

引用时有三种符号:

  • 转义符:\
  • 单引号:’
  • 双引号:”

转义符“\”

将转义符“\”放在Shell特殊字符之前, 则Shell忽略该字符原有的特殊含义。

⽤这种⽅式时,必须在每⼀个欲忽略其 特殊含义的特殊字符之前添加⼀个“\”字符。

单引号“’”

将字符串放在⼀对单引号之间,则单引号内的所有字符的特殊含义都被忽略,⽽只作为普通字符解释

例:下⾯两条命令是等效的

appledeMacBook-Pro:~ apple$ echo 'f*?'
f*?
appledeMacBook-Pro:~ apple$ echo f\*\?
f*?

例:

appledeMacBook-Pro:~ apple$ string='$PASH'
appledeMacBook-Pro:~ apple$ echo $string
$PASH

双引号“””

使⽤双引号的引⽤与单引号的类似,括在双引号内的⼤部分特殊字符被看作普通 字符,但也有⼀些特殊字符即便⽤双引号括 起来之后仍然保留着其特殊的意义,⽐如 $、\、”和`

appledeMacBook-Pro:~ apple$ pwd
/Users/apple
appledeMacBook-Pro:~ apple$ string="$HOME \$HOME"
appledeMacBook-Pro:~ apple$ echo $string
/Users/apple $HOME

命令替换符“ ` ”

命令替换符“ ` ”(反引号)的作⽤跟引⽤字符的作⽤相反。

反引号括起来的字符串被Shell解释为命令⾏,在执⾏时,Shell⾸先执⾏该命令⾏,并以 它的标准输出结果取代整个反引号(包括两个 反引号)部分。

这个字符所对应的键⼀般位于键盘的左上角

appledeMacBook-Pro:~ apple$ pwd
/Users/apple
appledeMacBook-Pro:~ apple$ string="current directory is `pwd`"
appledeMacBook-Pro:~ apple$ echo $string
current directory is /Users/apple

appledeMacBook-Pro:~ apple$ 
appledeMacBook-Pro:~ apple$ today=`date`
appledeMacBook-Pro:~ apple$ echo today is $today
today is 2019年 4月 9日 星期二 19时11分44秒 CST

在shell脚本中, 任何加在“#”号后⾯的数据将全 部被视为注释⽂字⽽被忽略(注意:后⾯紧接着 是“!”号的除外)。

shell脚本必须以类似于下⾯的⾏开始(必须放在 脚本的第⼀⾏):

!/bin/bash

意指使⽤/bin/bash作为shell解释执⾏此shell脚 本中的命令。

变量表达式

test是Shell程序中的⼀个表达式,通常⽤在 流程控制for、while、until、if等结构中,⽤test 命令去判断⽂件的存在与性质,变量的相互关系。

语法:test <表达式>

如果<表达式>成⽴,test返回0,反之,test 返回⼀个⾮0值

test使用情况

  • 字符串⽐较。
  • 两个数值的⽐较。
  • 逻辑操作,可以进⾏and/or,与其他条件联合 使⽤。
  • ⽂件操作,例如⽂件是否存在及⽂件的状态 等。

字符串比较

作⽤:测试字符串是否相等,⻓长度是否为零,字符串是否 为NULL。

常⽤字符串测试的<表达式>有:

-z <“字符串”>:⽐较字符串的⻓长度是否等于0,如果等于0则 为“是”,返回“0”,下同。

-n <”字符串”>:⽐较字符串的⻓长度是否⼤于0,如果⼤于0则 为“是”。

<字符串1> = <字符串2>:⽐较两个字符串是否相同,相同则 为“是”。等号两边要有空格。判断相等时也可⽤==。 <字符串1> != <字符串2>:⽐较两个字符串是否相同,不同则 为“是”。 !=两边要有空格

例:

appledeMacBook-Pro:~ apple$ str1=hello
appledeMacBook-Pro:~ apple$ test -z $str1  #判断长度是否为0
appledeMacBook-Pro:~ apple$ echo $?   		#显示结果
1																					#1表示结果不为0,即长度不等于0
appledeMacBook-Pro:~ apple$ test -n $str1		#测试长度是否大于0
appledeMacBook-Pro:~ apple$ echo $?
0
appledeMacBook-Pro:~ apple$ str2=abcd			#测试字符串是否等于abcd
appledeMacBook-Pro:~ apple$ test $str2 = abcd
appledeMacBook-Pro:~ apple$ echo $?
0
appledeMacBook-Pro:~ apple$ test $str1 == $str2			#测试两个字符串是否相等
appledeMacBook-Pro:~ apple$ echo $?
1
appledeMacBook-Pro:~ apple$ test $str1 != $str2			#测试两个字符串是否不等
appledeMacBook-Pro:~ apple$ echo $?
0

数字比较

常⽤于数值⽐较的<表达式>有: <数值表达式1> <算符> <数值表达式2>(算符两边要有空格),此处,<算符>可以是:

-eq: 两者相等。

-ne: 两者不等。

-lt: 前者⼩于后者。

-le: 前者⼩于或等于后者。

-gt: 前者⼤于后者。

-ge: 前者⼤于或等于后者。

appledeMacBook-Pro:~ apple$ int1=4
appledeMacBook-Pro:~ apple$ test $int1 -gt 2
appledeMacBook-Pro:~ apple$ echo $?
0  	#4>2
appledeMacBook-Pro:~ apple$ int1=1234
appledeMacBook-Pro:~ apple$ int2=01234
appledeMacBook-Pro:~ apple$ test $int1 -eq $int2
appledeMacBook-Pro:~ apple$ echo $?
0		#相等

文件操作

⽂件测试表达式通常是为了测试⽂件的⽂件操作逻辑,测试 符号如下。

-e:对象是否存在,存在则返回值为0。

-d:对象存在且为⽬录,则返回值为0。

-f:对象存在且为⽂件,则返回值为0。

-L:对象存在且为符号连接,则返回值为0。

-r:对象存在且可读,则返回值为0。

-s:对象存在且⻓长度⾮0,则返回值为0。

-w:对象存在且可写,则返回值为0。

-x:对象存在且可执⾏,则返回值为0。 !:测试条件的否定。与上述的符号⽤空格分隔开。

例:

(待完成,还有文件的基础知识未看)

逻辑测试

常⽤于逻辑测试的<表达式>有:

! <表达式>: <表达式>不成⽴。

<表达式1> -a <表达式2>:<表达式1>与<表达式2>同时成⽴。

<表达式1> -o <表达式2>:<表达式1>或<表达式2>成⽴。

appledeMacBook-Pro:~ apple$ test 1 == 1 -a 2 == 2
appledeMacBook-Pro:~ apple$ echo $?
0 #true
appledeMacBook-Pro:~ apple$ test 1 == 1 -a 2 == 3
appledeMacBook-Pro:~ apple$ echo $?
1 #false
appledeMacBook-Pro:~ apple$ test 1 == 1 -o 2 == 3
appledeMacBook-Pro:~ apple$ echo $?
0 #true
appledeMacBook-Pro:~ apple$ test ! 0
appledeMacBook-Pro:~ apple$ echo $?
1

Shell流程控制语句

和其他⾼级程序设计语⾔⼀样,Shell提供了⽤来 控制程序和执⾏流程的命令,包括条件分⽀和循环结构,⽤户可以⽤这些命令创建⾮常复杂的程序。

(1)条件控制:有if 、 case等结构。

(2)循环控制:有for、while、until等结构。

条件判断

在Shell程序中,条件判断语句可以使⽤if条件语句 和case条件语句,两者的区别在于使⽤case语句 的选项⽐较多⽽已。

if条件语句

控制流if的⽤法如下:

if <判别命令>;

then {命令清单1}

else {命令清单2} //else语句可省略

fi

此处,<判别命令>通常是上述的“test <表达式>” 。如果只写 <表达式>,则⽤中括号括起来,(中括号两边要有空格)。 如果<判别命令>返回0(对于test命令来说,就是其后的<表 达式>成⽴),则将执⾏then后的命令清单;反之,则执⾏else 后的命令清单。

shell语句中的分号

分号是多个语句之间的分隔符 ,当只有⼀个 语句的时候,末尾⽆需分号,最后⼀个语句后 ⾯也⽆需分号。

例如:

if [ XXXXXXXXXXXXX]; then

它完全等效于下⾯的两句:

if [ XXXXXXXXXXXXX]

then

Linux --shell基础_第4张图片

例:使用if-else语句创建shell程序,内容如下,文件名为bbbb.sh

echo -n "do you want to continue:Y or N:"
read ANSWER
if [ $ANSWER = N -o $ANSWER = n ];
then echo i will exit
else echo i will continue
fi

运行:

appledeMacBook-Pro:~ apple$ bash bbbb.sh
do you want to continue:Y or N:n
i will exit
appledeMacBook-Pro:~ apple$ bash bbbb.sh
do you want to continue:Y or N:y
i will continue

注意:

1.创建简单的Shell程序。 [、]、=、-o两边要有空格,=也可以 使⽤vi编辑器创建Shell程序, ⽤==(=作为赋值符号时不能写成==) ⽂件名为bbbb,⽂件内容如 下所示。

  1. $ANSWER,N两边写不写引号⽆所 谓

  2. 第五⾏也可以写成

    if test $ANSWER = N –o $ANSWER = n
    

【例】 使⽤if-then-else语句创建⼀个根据 输⼊的分数判断分数是否及格的Shell程序。

使⽤vi编辑器创建Shell程序,⽂件名为ak, ⽂件内容如下所示。

echo -n "please input your score:"
read score
echo "your score is $score"
if [ $score -ge 90 ];
then echo -n "优秀"
else if [ $score -ge 80 -a $score -lt 90 ];
then echo -n "良好"
else if [ $score -ge 70 -a $score -lt 80 ];
then echo -n "中等"
else if [ $score -ge 60 -a $score -lt 70 ];
then echo -n "及格"
else echo -n "不及格"
fi
fi
fi
fi

运行:

cBook-Pro:~ apple$ bash ak.sh
please input your score:88
your score is 88
良好appledeMacBook-Pro:~ apple$ bash ak.sh
please input your score:77
your score is 77
中等appledeMacBook-Pro:~ apple$ bash ak.sh
please input your score:66
your score is 66
及格appledeMacBook-Pro:~ apple$ bash ak.sh
please input your score:44
your score is 44
不及格appledeMacBook-Pro:~ apple$ 
case条件语句

if条件语句⽤于在两个选项中选定⼀项,⽽case条件选择为⽤ 户提供了根据字符串或变量的值从多个选项中选择⼀项的⽅ 法,其语法格式如下所示:

case <变量> in

<字符串1> ) {<命令清单1>};; )后⾯可以没有空格

<字符串n> ) {<命令清单n>};;

*) {其他命令};;

esac

执⾏时,将判别**<变量>的值与所列出的n个字符串的哪⼀个 匹配**,然后就执⾏其后的命令清单,直到遇到⼀对分号(;;)为 ⽌。字符串中可含通配符,如果能同时匹配多个字符串,则只执⾏第⼀个匹配字符串后的命令。

在case运算式中也可以使⽤Shell的通配符 (“*”,“?”,“[ ]”)。

通常⽤“*”作为case命令的最后运算式以便在前⾯找不到任何相应的匹配项时执⾏“其他命令”的命令。

例:capital.sh

# $1意思是输入的第一个内容
case $1 in
    china) echo beijing;;
    usa) echo washington;;
    uk) echo london;;
    russia) echo moskow;;
    *) echo out of my knowledge;;
esac

运行:

appledeMacBook-Pro:~ apple$ bash capital.sh china
beijing
appledeMacBook-Pro:~ apple$ bash capital.sh uk
london
appledeMacBook-Pro:~ apple$ bash capital.sh usa
washington
appledeMacBook-Pro:~ apple$ bash capital.sh russia
moskow
appledeMacBook-Pro:~ apple$ bash capital.sh japan
out of my knowledge

例:使⽤case语句 创建⼀个菜单选择的 Shell脚本。 使⽤vi编辑器创建 Shell程序,⽂件名 为za,

echo "1 restore"
echo "2 backup"
echo "3 unload"

echo -n "enter choice"
read choice
case $choice in
1) echo "retore";;
2) echo "backup";;
3) echo "unload";;
*) echo "sorry,wrong!"
exit 11
esac

运行:

appledeMacBook-Pro:~ apple$ bash za.sh
1 restore
2 backup
3 unload
enter choice1
retore
appledeMacBook-Pro:~ apple$ bash za.sh
1 restore
2 backup
3 unload
enter choice2
backup
appledeMacBook-Pro:~ apple$ bash za.sh
1 restore
2 backup
3 unload
enter choice3
unload
appledeMacBook-Pro:~ apple$ bash za.sh
1 restore
2 backup
3 unload
enter choice4
sorry,wrong!

【例】假如给出⽉份数 字作为参数,你就能编写 ⼀个回送⽉份名的脚 本month。当所给出的数 字不在1和12之间时,将 得到出错消息。

echo "enter month:"
read month
case $month in
1|01) echo "一月";;
2|02) echo "二月";;
3|03) echo "三月";;
4|04) echo "四月";;
5|05) echo "五月";;
6|06) echo "六月";;
7|07) echo “七月”;;
8|08) echo "八月";;
9|09) echo "九月";;
10) echo “十月”;;
11) echo "十一月";;
12) echo “十二月”;;
*) echo "wrong!"
esac

运行:

appledeMacBook-Pro:~ apple$ bash month.sh
enter month:
2
二月
appledeMacBook-Pro:~ apple$ bash month.sh
enter month:
09
九月
appledeMacBook-Pro:~ apple$ bash month.sh
enter month:
12
“十二月”
appledeMacBook-Pro:~ apple$ bash month.sh
enter month:
15
wrong!

|两边不加空格也可以,注意是|,而不是||

循环控制

在Shell程序中使⽤循环控制语句可以使⽤for语 句、while语句以及until语句

for语句循环

for循环的语法结构如下:

for <循环变量> [in <循环变量取值集>]

do <命令清单>

done

如果for语句的后半部分被省略,则默认的<循环变量 取值集>就是命令⾏参数集

如果命令清单中有多条命令,系统会依次执⾏。

例:显示2012年头3个⽉⽉历的shell脚本

for i in 1 2 3 4
do cal $i 2019
done

运行:

appledeMacBook-Pro:~ apple$ bash show.sh
      一月 2019         
日 一 二 三 四 五 六  
       1  2  3  4  5  
 6  7  8  9 10 11 12  
13 14 15 16 17 18 19  
20 21 22 23 24 25 26  
27 28 29 30 31        
                      
      二月 2019         
日 一 二 三 四 五 六  
                1  2  
 3  4  5  6  7  8  9  
10 11 12 13 14 15 16  
17 18 19 20 21 22 23  
24 25 26 27 28        
                      
      三月 2019         
日 一 二 三 四 五 六  
                1  2  
 3  4  5  6  7  8  9  
10 11 12 13 14 15 16  
17 18 19 20 21 22 23  
24 25 26 27 28 29 30  
31                    
      四月 2019         
日 一 二 三 四 五 六  
    1  2  3  4  5  6  
 7  8  9 10 11 12 13  
14 15 16 17 18 19 20  
21 22 23 24 25 26 27  
28 29 30 

或者:

for i 
do cal $i 2019
done

#运行:
bash show.sh 1 2 3 4

expr 命令

expr命令是⼀个⼿⼯命令⾏计数器,⽤于在UNIX/LINUX下 求表达式变量的值,⼀般⽤于整数值,也可⽤于字符串。

格式为:

expr Expression

(命令读⼊Expression 参数,计算它的值,然后将结果写⼊到标准输出)

参数应⽤规则:

  • ⽤空格隔开每个项;
  • ⽤ \ (反斜杠) 放在 shell 特定的字符前⾯;
  • 对包含空格和其他特殊字符的字符串要⽤引号括起来

expr用法实例

  • 整数运算
appledeMacBook-Pro:~ apple$ expr 15%3
15%3
appledeMacBook-Pro:~ apple$ expr 15 % 3
0
appledeMacBook-Pro:~ apple$ expr 100 + 20
120
appledeMacBook-Pro:~ apple$ expr 30 / 3 * 2
expr: syntax error
appledeMacBook-Pro:~ apple$ expr 30 / 3 \* 2
20
#注意乘法中符号的使用,* 前面要加反斜杠屏蔽其特殊含义
  • 计算字串长度
  • 增量计数

​ 说明:expr在循环中⽤于增量计算。先将变量初始 化为0,然后循环值加1,反引号的⽤法为命令替代。

#loop=0
#loop=`expr $loop + 1`

例:使⽤for语句创建求命令⾏上所有整数之和的Shell 程序,文件名:sum

sum=0
for i in $*
do sum=`expr $sum + $i`
done
echo $sum

运行:

appledeMacBook-Pro:~ apple$ bash sum.sh 1 2 3 4 5
15
appledeMacBook-Pro:~ apple$ bash sum.sh 1 2
3
while循环语句

控制流while也是⼀种循环控制结构,⽤法是:

while <判别命令>

do <命令清单>

done

当<判别命令>返 回0时(对于test命令,就是其后的 表达式成⽴),则执⾏do后的命令清单,然后再重作 循环;否则,退出循环。

while控制经常与前述的shift命令结合使⽤。

例:编写⼀个shell脚本exist,⽤于判别其后⽤参数⽅式指 定的⼀系列⽂件是否存在。

while test -n "$1"
do
 if test -e $1
    then echo "$1 exist"
    else echo "$1 not exist"
 fi
shift
done

运行:

appledeMacBook-Pro:~ apple$ bash exist.sh abs
abs not exist
appledeMacBook-Pro:~ apple$ bash exist.sh show
show not exist
appledeMacBook-Pro:~ apple$ bash exist.sh show.sh
show.sh exist
appledeMacBook-Pro:~ apple$ bash exist.sh sum.sh
sum.sh exist

例:使⽤while语句创建⼀个计算1到5的平⽅的Shell程序。

loop=0
sum=0
while test $loop -lt 5  #loop<5时
do
 d=`expr $loop \* 2`
 sum=`expr $sum + $d`
 loop=`expr $loop + 1`
done
echo "$sum"

运行:

appledeMacBook-Pro:~ apple$ bash qiuhe.sh
20

例:使⽤while 语句创建⼀个输 ⼊exit退出的Shell 程序。

echo -n "enter :"
read exit
while [ $exit = "exit" ]
do 
 echo " shutdown!"
 shutdown -h now
done
until循环语句

until 控制流与while 控制流⽤法类似,但作 ⽤相反。⽤法为:

until <判别命令>

do <命令清单>

done

当<判别命令>返回⾮0值时,执⾏do后的< 命令清单>,然后循环检查条件;

当<判别命令 >返回0值时,退出循环

例:加从0开始的五个偶数(使⽤until语句)

loop=0
sum=0
until test $loop -ge 5
do
 d=`expr $loop \* 2`
 sum=`expr $sum + $d`
 loop=`expr $loop + 1`
done
echo $sum

例:使⽤until语句创建⼀个计算1~5的平⽅的Shell程序。

int=1
until test $int -gt 5
do 
 result=`expr $int \* $int`
 echo $result
 int=`expr $int + 1`
done

运行:

appledeMacBook-Pro:~ apple$ bash pingfang2.sh
1
4
9
16
25

break和continue语句

有时需要基于某些准则退出循环或跳过循环步。shell提供两个命令实现此功能。 (

1)break

(2)continue

break和continue的最⼤区别在于,break跳出整个循 环,⽽c**ontiune则跳过当次循环的剩余部分并直接进⼊ 下⼀次循环。**这两个的⽤法和C语⾔相同。

here文本

在shell脚本中,还可以利⽤所谓的“here⽂ 本”功能,即可在脚本⽂件中嵌⼊⼀段⽂档,作 为脚本中所使⽤的命令的标准输⼊。具体⽤法 为:

<命令> <

<作为输⼊的⽂本内容>

!

其中“!”符号也可⽤“EOF”、“END”等替代。

使⽤here⽂本,可以⽅便地将⼀些需要进 ⾏⽤户交互的命令放⼊到shell脚本中。

函数

在脚本中定义使用函数

所有函数在使⽤前必须定义。

这意味着必须将函数 放在脚本开始部分,直⾄shell解释器⾸次发现它时, 才可以使⽤。

下⾯将⾃定义⼀个函数,⽤于显示当前系统的时 间。

Time()
{
echo "The system time now is `date `" 
}

函数的调⽤,只需要使⽤函数名就可以调⽤已经定义好的函 数。

你可能感兴趣的:(Linux)