linux笔记——shell脚本编程

shell脚本基本知识

shell脚本本质:shell命令的有序集合
编译型语言、解释性语言:shell

shell编程基本步骤:

1、创建shell文件(.sh)
2、赋予shell文件执行权限:用chmod修改权限
3、执行shell文件:直接在命令行调用shell程序

实例

1、创建shell文件:

$ cat  prog1.sh
date

2、赋予执行权限(初始文本文件无执行权限):

$ chmod 740 prog1.sh

3、执行该shell程序

$ prog1.sh
  prog1.sh:not found

(shell在标准搜索路径中找不到prog1.sh)
4、指定路径或修改环境变量path后执行shell程序

$ ./prog1.sh  

shell变量

shell允许用户建立变量存储数据,但不支持数据类型(如:整形、浮点型),将任何赋给变量的值都解释为一串字符:

variable=value
  • count=1
  • echo $count
  • DATE=‘date’
  • echo $DATE

位置变量

$0 :与键入的命令行一样,包含脚本文件名
$1,$2…$9 :分别包含第一道第九个命令行参数
$# :包含命令参数的个数
$@ :包含所有命令行参数:“$1,$2,…$9”
$? :包含前一个命令的退出状态
$* :包含所有命令行参数:“$1,$2,…$9”
$ $ :包含正在执行进程的ID号

常用shell环境变量

HOME:/etc/passwd文件中累出的用户主目录
IFS:internet field separator,默认为空格,tab及换行符
PATH:shell搜索路径
PS1,PS2:默认提示符$及换行提示符>
TERM:终端类型

shell功能语句

shell程序由0或多条shell语句构成,shell语句包括:说明性语句、功能语句、结构性语句

说明性语句:以#开始到该行结束,不被解释执行
功能性语句:任意的shell命令,用户程序或其他shell程序
结构性语句:条件测试语句、多路分支语句、循环语句等

说明性语句(注释行)

出现在任意位置,可单独占一行也可放在执行语句后,例如:

#! /bin/sh
#
#本程序说明
#
command_1
command_2     #command_2语句的说明
...........
#下面程序段的说明
command_m
command_n     #commandn的说明

常用功能性语句(命令)

read:从标准输入读入一行,并赋值给后面的变量

语法:

read  var

把读入的数据全部赋值给var:

read var1 var2 var3

把读入行的第一个单词赋给var1,第二个但此次赋给var2…把其余所有的词赋给最后一个变量

注意:如果执行read语句时标准输入无数据,则程序在此停留等候到数据的到来或者被中止运行

expr:算术运算,主要用于简单的整数运算

简单的整数运算:加+、减-、乘*、整除/和求模%

例如:

$ expr 12 + 5 \* 3
27
$ expr 3 - 8 / 2
-1

$ num=9
$ sum= 'expr $num \* 6'
$ echo $ sum
54

test:测试语句

text测试条件成立时,命令返回值为真(0),否则返回值为假(非0)

test测试对象:字符串、整数、文件属性

每种测试对象都有若干测试操作符,例如:

test "$answer" = "yes"
# 变量answer的值是否为字符串yes
test $num -eq 18
# 变量num的值是否等于整数18
test -d tmp
# 测试tmp是否为一个目录名
字符串测试:

s1 = s2 :测试两个字符串内容是否完全一样
s1! = s2 :测试两个字符串的内容是否有差异
-z s1 :测试s1字符串的长度是否为0
-n s1 :测试s1字符串的长度是否不为0

整数测试

a -eq b :a、b是否相等(equal to)
a -ne b :a、b是否不相等(not equal to)
a -gt b :a是否大于b(greater than)
a -ge b :a是否大于等于b( greater than or equal to)
a -lt b : a是否小于b(less than)
a -le b :a是否小于等于b(less than or equal to)

文件测试

-d name:测试name文件是否为一个目录
-e name:测试文件是否存在
-f name:测试name是否为普通文件
-L name:测试name是否为符号链接
-r name:测试name文件是否存在且为可读
-w name:测试name文件是否存在且为可写
-x name:测试name文件是否存在且为可执行
-s name:测试name文件是否存在且其长度不为0
f1 -nt f2:测试文件f1是否比文件f2更新
f1 -ot f2:测试文件f1是否比文件f2更旧

shell分支语句

结构性语句

结构性语句主要根据程序的运行状态、输入数据、变量的取值、控制信号以及运行时间等因素来控制程序的运行流程。

主要包括:条件测试语句(两路分支)、多路分支语句、循环语句、循环控制语句和后台控制语句等

条件语句
if…then…fi

语法结构:

if     表达式
then 
       命令表
fi

若表达式为真,则执行,否则退出if语句执行fi之后的语句
if和fi必须成对使用

例如:在test命令中
方式1:

test  $name -eq $1
echo $?

方式2:

if test -f $filename
then
    ......
 fi

方式3:

if [  -f $filename]
then
      .........
fi

多路分支语句

case…esac
多路分支语句用于多重条件测试,语法为:

case  字符串变量   in   #case语句只能检测字符串变量
     模式1)             
               命令表1    #各模式中可用文件名元字符,以右括号结束
               ;;
     模式2|模式3)  #一次可以匹配多个模式用“|”分开
               命令表2
               ;;      #命令表与单独的双分号结束,退出case语句
     ........
     模式n)      #模式n常写为字符*表示所有其他模式
               命令表n
               ;;     #最后一个双分号可省略
esac     

shell循环语句

循环语句for

循环体由语句括号do和done来限定,格式:

for   变量名  in   单词表
do
      命令表
done

linux笔记——shell脚本编程_第1张图片
执行结果:
linux笔记——shell脚本编程_第2张图片

循环语句while

语法结构:

while    命令或表达式
    do
       命令表
    done

shell函数

调用函数

function(){
}

例如:建立一个fun函数

vi fun.sh

#!/bin/bash

fun(){
echo  "hello world"}

fun

$ chmod 740 fun.sh
$ ./fun.sh
在这里插入图片描述
再例如:

#!/bin/bash

fun(){
       A=$1
       B=$2
       C=$3
       echo "hello world"
       NUM='expr $A + $B + $C'
       echo "NUM=$NUM"
       return $NUM}
fun 1 2 3
echo "\$?=$?"

你可能感兴趣的:(嵌入式)