Shell脚本学习笔记(2)——Shell变量以及程序语句详解

上两篇文章详细介绍了Linux的常用命令以及Shell的基本认识。
Linux常用命令:https://blog.csdn.net/weixin_44895651/article/details/105289038
Shell基础:https://blog.csdn.net/weixin_44895651/article/details/105931755

Shell变量

       Shell允许用户建立变量存储数据,但是不支持数据类型(整形、字符、浮点型),将任何变量的值都解释为一个字符串
       Shell变量不需要向C语言中那样需要提前定义,Shell变量可以直接赋值。
例如:

count=1#定义一个count变量,并且赋值为1
echo $count#打印变量的值

DATE=date#定义一个DATE变量,并且把日期赋值给该变量(属于命令置换)
echo $DATE#打印日期

       打印Shell变量必须加上$符号,如果不加该符号会默认打印该字符串。同时等号两边不加空格。
Bourne Shell的四种变量:

  • 用户自定义变量
           在Shell编程中通常使用全大写变量,方便识别
           变量的调用:在变量前加$符号
           Linux Shell/bash从右向左赋值
$Y=y
$ X=$Y
$ echo $X
y

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

$ Z=hello
$ echo ¥Z
hello
$ unset Z#删除变量

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

        当参数数量超过两位数时,需要加上大括号

  • 环境变量
           在使用系统时,已经在脚本中提前写好的一些环境变量。
    常用的Shell环境变量:
变量名 作用
HOME /etc/passwd文件中列出用户主目录
IFS 默认为空格,tab及换行符
PATH Shell搜索路径
PS1,PS2 默认提示符($)及换行提示符(>)
TERM 终端类型,常用的有vt100,ansi,vt200,xterm等

Shell程序和语句

       Shell程序由零或者多条Shell语句构成。Shell语句包括三类:

       说明性语句:以#开始到改行结束,不被执行(除脚本第一行告诉系统用那种类型的Shell来执行

       功能性语句:任意shell命令、用户程序或者其它shell程序。

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

read var#把读入的数据全部赋给var
read var1 var2 var3#把读入的第一个单词赋值给var1,第二个赋值给var2...

       注意:如果执行read语句时标准输入无数据,则程序在此处停留,直到数据到来或者被终止执行。

#输入一个变量:
#!/bin/bash
echo 'input a number'
read NUM
echo $NUM
#输入多个变量:
#!/bin/bash
echo 'input year month day'
read Y M D
echo "today is $Y-$M-$D"

注意:如果变量输入多了,多余的值全部赋值给最后一个变量。
       ②算数运算命令expr主要用于简单的整数运算,包括加(+)、减(-)、乘(*)、除(/)和求模(%)等。

#!/bin/bash
A='expr 3 + 5 \* 4'#注意运算符两边必须有空格
echo $A

       注意:变量赋值没有空格,算数运算符两侧有空格

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

test '$answer' = 'yes'#测试变量answer是否为字符串类型
test $num -eq 18#测试变量num是否为整数18
test -d tmp#测试tmp是否为一个目录名

       字符串测试:

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

       整数测试:

命令 测试内容
a -eq b 测试a和b是否相等
a -nq b 测试a和b是否不相等
a -gt b 测试a是否大于b
a -ge b 测试a 是否大于等于b
a -lt b 测试a是否小于b
a -le b 测试a是否小于等于b

       文件测试:

命令 测试内容
-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更旧

       结构性语句:条件测试语句、多路分支语句、循环语句、循环控制语句等。
       ① 条件语句:

语法结构 1:
if 表达式
	then 命令表
fi
说明:
- 如果表达式为真,则执行命令表中的命令;负责退出if语句,即执行fi后面的语句
- if和fi是条件语句的句号括号,必须成对使用
- 命令表中的命令可以是一条也可以是若干条

语法结构 2:
if 表达式
then 命令表1
else 命令表1
fi
- 如果表达式为真,则执行命令表1中的命令,再退出if语句;负责执行命令表2中的语句,再退出if语句

       注意:在Shell中表达式为真——为0即为真。可以是一条,也可以是多条表达式来判断。同时也可以像C语言一样进行嵌套

if [ $# -ne 1 ] #如果没有提供文件名的话则给用户提示
then
    echo 'usage:$0 filename'
    exit
fi

if [ -e $1 ] #测试文件是否存在
then
    echo '$1 not exit'
    exit
fi

if [ -L $1 ] #测试文件是否为一个链接文件
then
    echo 'l'
elif [ -d $1 ]
then
    echo 'd'
elif [ -f $1 ]
then
    echo '-'
elif [ -b $1 ]
then
    echo 'b'
else
    echo 'd'
fi

       ② 多路分支语句 case…esac
       多路分支语句case用于多重条件测试,语法结构清晰自然。其语法为:

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

       注意:case语句只能检测字符串变量;各模式中可用文件名元字符,以右括号结束;命令行以单独的双分号行结束,退出case语句;模式n常写为字符*表示所有其它模式;最后一行双分号可以省略

echo -n 'please choose (yes|no)?' #-n是不换行
read R
case $R in
    yes | y | Y | YES )
          echo 'yes'
          ;;
    no | n | NO | N )
          echo 'no'
          ;;
    *)
          echo 'wrong'
esac

       ③ 循环语句

       当循环次数已知或确定时,使用for循环语句来多次执行一条或者一组命令。循环体由语句do和done来限定。格式如下:

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

       变量依次取单词表中的各个单词,每取一次单词,就执行一次循环体中的命令。循环次数由单词表中的单词个数确定。命令表中的命令可以是一条,也可以是由分号或者换行符分开的多条。

#方法一:
SUM=0
for I in $(seq 0 2 100) #实现的功能是for(I=0;I<=100;I=I+2)
do
    echo $I
   SUM=$SUM+$I
done
echo $[SUM]

#方法二:
SUM=0
for ((I = 1; I <= 100 ; I=I+2))
do
    echo $I
    SUM=$SUM+$I
done
echo $[SUM]

       当不知道循环次数时,我们选择使用while循环。循环语法结构如下:

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

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

SUM=0
I=100
while [ $I -ge 0 ] #判断变量I是否大于等于0
do
    SUM=$SUM+$I
    I=$(($I-2))
done
echo $[SUM]

       这几段代码中有关于变量运算的知识,具体的请戳链接:Linux Shell之数字加减文章中有详细介绍。
      ④循环控制语句break和continue

break n #跳出n层
continue语句则马上转到最近一层循环语句的下一轮循环上。
continue n#转到最近n层循环语句的下一轮循环上
I=1
while [ $I -lt 5 ]
do
    J=1
    while [ $J -lt 5 ]
    do
        J=$(($J+1))
        if [ $J -gt 3 ]
        then
            break 2 #跳出两层循环
        fi
        echo "$I-$J"
    done
    I =$(($I+1))
done

       输出结果:
在这里插入图片描述

       不积小流无以成江河,不积跬步无以至千里。而我想要成为万里羊,就必须坚持学习来获取更多知识,用知识来改变命运,用博客见证成长,用行动证明我在努力。
       如果我的博客对你有帮助、如果你喜欢我的博客内容,请“点赞” “评论” “收藏”三连哦!听说点赞的人运气不会太差,每一天都会元气满满呦!如果实在要白嫖的话,那祝你开心每一天,欢迎常来我博客看看。
在这里插入图片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章