上两篇文章详细介绍了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变量
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
输出结果:
不积小流无以成江河,不积跬步无以至千里。而我想要成为万里羊,就必须坚持学习来获取更多知识,用知识来改变命运,用博客见证成长,用行动证明我在努力。
如果我的博客对你有帮助、如果你喜欢我的博客内容,请“点赞” “评论” “收藏”
三连哦!听说点赞的人运气不会太差
,每一天都会元气满满呦!如果实在要白嫖的话,那祝你开心每一天,欢迎常来我博客看看。