前言

今天是2021年的第五天,又断更了呀,我尽量摆脱游戏。陪大家一起学习0.0。
三连即可提高学习效率0.0

🧑🏻作者简介:一个学嵌入式的年轻人
✨联系方式:2201891280(QQ)
📔源码地址:https://gitee/xingleigao/study_qianrushi
全文大约阅读时间: 60min


文章目录

  • 前言
  • shell编程-变量
    • shell脚本的基础知识
      • shell脚本的本质
      • shell 编程的基本过程
    • shell变量
      • 用户自定义变量
      • 位置变量
      • 常用shell环境变量
  • shell编程-功能语句
    • 说明性语句(注释行)
    • 常用功能性语句(命令)
      • read 读入数据
      • expr命令 用于算数运算
      • test语句 测试语句
  • shell编程-分支语句
    • 条件语句
    • 多路分支语句
  • shell编程-循环语句
    • 循环语句for的用法
    • 循环语句while的用法
    • 循环控制语句
  • shell编程-函数
    • shell函数调用
    • 函数变量作用域
  • 写在最后


shell编程-变量

shell脚本的基础知识

shell脚本的本质

语言的分类:解释性语言编译型语言

  • shell脚本语言是解释型语言
  • shell脚本的本质:shell命令的有序集合

shell 编程的基本过程

  1. 建立shell文件
    包含任意多行操作系统命令或shell命令的文本文件;一般以.sh结尾
  2. 赋予shell文件执行权限
    用chmod命令修改权限;一般用chmod u+x就是读和执行权限。
  3. 执行shell文件
    直接使用命令行调用shell程序

shell变量

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

Variable=value

等号两边一定不能加空格

count=1
echo $count
Datat

Bourne Shell有如下四种变量:

  • 用户自定义变量
  • 位置变量即命令行参数
  • 预定义变量
  • 环境变量

用户自定义变量

在shell编程中通常使用全大写变量,方便识别 $ COUNT=1
变量的调用:在变量前加$ $ echo $HOME
Linux Shell/bash从右向左赋值

$Y=y
$ X=$Y
$ echo $X 
y 

使用unset命令删除变量的赋值 unset Z

位置变量

命令作用
$0与键入的命令行一样,包含脚本文件名
$1,$2,……$9分别包含第一个到第九个命令行参数(如果大于等于10要使用{}例如${10})
$#包含命令行参数的个数(不包含本身./文件名)
$@包含所有命令行参数:“$1,$2,……$9”
$?包含前一个命令的退出状态
$*包含所有命令行参数:“$1,$2,……$9”
$$包含正在执行进程的ID号

常用shell环境变量

HOME: /etc/passwd文件中列出的用户主目录
IFS:Internal Field Separator, 默认为空格,tab及换行符
PATH :shell搜索路径
PS1,PS2:默认提示符($)及换行提示符(>)
TERM:终端类型,常用的有vt100,ansi,vt200,xterm等

shell编程-功能语句

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

说明性语句(注释行)

注释行可以出现在程序中的任何位置,既可以单独占用一行, 也可以接在执行语句的后面. 以#号开始到所在行的行尾部分,都不被解释执行. 例如:# 下面程序段的说明
但是:#! /bin/sh需要告诉编译器使用哪个shell


常用功能性语句(命令)

read 读入数据

read var
read var1 var2 var3
把读入行中的第一个单词(word)赋给var1, 第二个单词赋给var2, ……把其余所有的词赋给最后一个变量.
如果执行read语句时标准输入无数据, 则程序在此停留等侯, 直到数据的到来或被终止运行。
如果输入的时候希望和提示信息同一行可以:

  1. 使用sh/c来实现
  2. 使用bash利用echo -n实现

expr命令 用于算数运算

expr  12  +  5  \*  3

算数运算的时候不能省略空格!!!
sum=`expr $num \\* 6 `
$变量名表示变量的值
但是给变量赋值的时候两边不可以加空格!!!


test语句 测试语句

测试的三种类型:

  1. 字符串
  2. 整数
  3. 文件属性
test "$answer" = "yes" #变量answer值是否是yes
test $num -eq 18 #判断num是否是整数18
test -d tmp #是否是一个目录

test的一些参数 (记不住。。学废了,没事回来看看吧0.0)

参数使用含义
字符串
=s1 = s2测试字符串是否完全一样
!=s1 != s2测试两个字符串的内容是否有差异
-z-z s1测试s1字符串的长度是否为0
-n-n s1测试s1字符串的长度是否不为0
整数
-eqa -eq b测试a与b是否相等
-nea -ne b测试a与b是否不等
-gta -gt b测试a是否大于b
-gea -ge b测试a是否大于等于b
-lta -lt b测试a是否小于b
-lea -le b测试a是否小于等于b
文件目录
-d-d name测试name 是否为一个目录
-e-e name测试一个文件是否存在
-f-f name测试name 是否为普通文件
-L-L name测试name 是否为符号链接
-r-r name测试name 文件是否存在且为可读
-w-w name测试name 文件是否存在且为可写
-x-x name测试name 文件是否存在且为可执行
-s-s name测试name 文件是否存在且其长度不为0
-ntf1 -nt f2测试文件f1 是否比文件f2 更新
-otf1 -ot f2测试文件f1 是否比文件f2 更旧
-oa -le b -o a -le 100测试两个条件是否至少一个满足条件

shell编程-分支语句

结构性语句主要根据程序的运行状态、输入数据、变量的取值、控制信号以及运行时间等因素来控制程序的运行流程。
主要包括:条件测试语句(两路分支)、多路分支语句、循环语句、循环控制语句和后台执行语句等。


条件语句

if    表达式
then  命令表
fi     
  • 如果表达式为真, 则执行命令表中的命令; 否则退出if语句, 即执行fi后面的语句。
  • if和fi是条件语句的语句括号, 必须成对使用;
  • 命令表中的命令可以是一条, 也可以是若干条。

可以使用test命令test命令测试的条件成立时, 命令返回值为真(0),否则返回值为假(非0).if test -f $filename也可以使用[]方括号来代替if [ -f $filename ]方括号
举个例子:

if   [  -f   $1  ]         (测试参数是否为文件)
then
echo "File  $1  exists"                     (引用变量值)
fi
if   [  -d   $HOME/$1  ]                    (测试参数是否为目录)
then 
	echo "File  $1 is  a  directory"       (引用变量值)
fi 

if    表达式
then  命令表
elif  表达式
then  命令表1
else  命令表2
fi

如果表达式为真, 则执行命令表1中的命令, 再退出if语句; 否则执行命令表2中的语句, 再退出if语句.


多路分支语句

case…esac

case   字符串变量   in
           模式1)
                      命令表1
                       ;;
           模式2 | 模式3)   
                      命令表2
                       ;;
            ……
           模式n)
                     命令表n
                       ;;
   esac

可以使用如下的例子作为练习:

# The statement of  case…esac
if   [  $#  -eq  0  ]
then
		echo  "No argument is declared"
		exit
fi
case  $1  in
		file1)
			echo  "User selects file1"
			;;
		file2)
			echo  "User selects file2"
			;;
		*)
			echo  "You must select either file1 or file2!"
			;;
esac

shell编程-循环语句

循环语句for的用法

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

科普一个seq命令,用于列出一系列数字类似于python的range

for I in `seq 1 100`
do
	SUM=`expr $SUM + $I`
done
echo $SUM

程序就用于生成0-100的求和值。
也可以使用类似于C语言的写法。

for ((I = 1; I <= 10 ; I++)) #注意是两个括号
do
	SUM=`expr $SUM + $I`
done
echo $SUM

循环语句while的用法

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

while语句首先测试其后的命令或表达式的值,如果为真,就执行一次循环体中的命令,然后再测试该命令或表达式的值,执行循环体,直到该命令或表达式为假时退出循环。

#!/bin/bash

I=0

while [ $I -lt 5 ]
do
       I=`expr $I + 1`
       echo -n "input score:"
       read $S
       case 'expr $S/10' in
       10 |9)
               echo "A"
               ;;
       6|7|8)
               echo "B"
               ;;
       *)
               echo "C"
               ;;
       esac
       echo "$I"
done

上面的脚本用来输入信息输出对应的字母,一共五次。


循环控制语句

break 和 continue
break n则跳出n层;
continue语句则马上转到最近一层循环语句的下一轮循环上,
continue n则转到最近n层循环语句的下一轮循环上.

shell编程-函数

shell函数调用

#方式1拿到传参
value_name=`function_name  [arg1 arg2 … ]`

#方式2拿到传参
function_name  [arg1  arg2  …  ]
echo   $?

举个例子:

grep_user()
{
       R=`grep "^$1:" /etc/passwd | wc -l` #以l开头 以:结尾
       echo $R
       return $R
}

echo -n "input sername:"
read USER
grep_user $USER
RET=$?
if [ $RET -eq 1 ]
then
       echo "$USER exist"
else
       echo "$USER not exist"
fi
echo "-$?-"

函数变量作用域

  • 全局作用域:在脚本的其他任何地方都能够访问该变量。
  • 局部作用域:只能在声明变量的作用域内访问。

声明局部变量的格式:Local variable_name =value

Scope()
{
Local lclvariable =1
Gblvariable = 2
echo “lclavariable in function = $ lclvariable ”
echo “Gblvariable in function = $ Gblvariable ”
}

Scope

echo “lclavariable in function = $ lclvariable ”
echo “Gblvariable in function = $ Gblvariable ”

写在最后

今天主要讲解了基本的shell编程,这些东西也不好记,需要时常回来翻一翻,基本上shell部分的就完结了,接下来就是多翻翻,多写写了。最后三连即可提高学习效率!!!


另外我在更新的就是算法笔记的一些例题笔记,这个系列是用于提高我的算法能力,如果有兴趣对算法领域感兴趣找不到合适的入门文章也可以追更,如果我更新的太慢了请大家点赞收藏,一键三连才能更有更新的动力呀0.0

更多推荐

【从零开始的嵌入式生活】LinuxC语言——shell脚本编程