一、shell脚本系统环境变量
系统环境变量:和系统相关的并且已经预定义好的变量。
PATH: 环境变量中的路径信息。文件或者命令在当前路径下找不到则从PATH路径中查找。
USER:当前的用户名
UID:当前用户的id
HOME:当前用户的主目录位置
PWD:当前所在的位置
TERM:终端的类型 xterm
备注: 多行注释表示可以对跨行的代码一次性的注释。格式如下
:<<!
sadgasd
!
二、测试语句
1.中括号用来实现逻辑运算,是计算测试语句的运算符 [ ]
2.关系运算符
-eq : 比较左右两个值是否相等
-ne:比较两个值不相等则为真
-gt :比较左值是否大于右值,如果大于则结果为真
-ge :比较左值大于或者等于右值,满足则为真
-lt : 比较左值是否小于右值,如果小于则结果为真
-le :比较左值是否小于等于右值,如果满足则结果为真
-o :表示或者的关系,表达式左侧和右侧有一个为真结果为真
- a : 表示并
1
输入三个值: 判断哪个值最大,打印出来。
案例:
echo "请输入三个值"
read num1 num2 num3
if [ $num1 -ge $num2 -a $num1 -ge $num3 ]
then
echo "最大值${num1}"
fi
if [ $num2 -ge $num1 -a $num2 -ge $num3 ]
then
echo "最大值${num2}"
fi
if [ $num3 -ge $num1 -a $num3 -ge $num2 ]
then
echo "最大值${num3}"
fi
3.文件运算符
-b 文件名:判断文件是否为块设备文件
-x 文件名:判断文件是否有执行权限,不管是哪个用户,只要有就行
-r 文件名:判断文件是否有读权限,不管是哪个用户,只要有就行
-w 文件名:判断文件是否有写权限,不管是哪个用户,只要有就行
-e 文件名: 判断文件是否存在
-f 文件名:判断文件是否为普通文件
-p 文件名:判断文件是否为管道文件
-s 文件名: 判断文件是否存在,并且不为空
文件名1 -ot 文件名2: 判断文件1是否比文件2更旧
文件名1 -nt 文件名2:判断文件1是否比文件2 更新
案例:
echo "请输入文件名"
read myfile
if test -x $myfile
then
echo "danny有可执行权限"
fi
if test './danny' -nt $myfile
then
echo "danny是否比${myfile}新"
fi
if test './danny' -ot $myfile
then
echo "danny更旧"
fi
4.test语句:用来替换中括号,可以做逻辑运算
格式: test 测试条件
等价: [ 测试条件 ]
案例: if test $a -gt $b
练习:判断文件是否存在,如果存在则判断是否为目录,如果是目录则跳 转到目录中后创建danny文件。
三、if分支语句
1. if是分支语句,使用格式如下
if [ 测试语句 ]
then
语句
fi
2.c语言中的if语句格式
if(条件)
{
语句;
}
3.格式2:如果满足条件执行if,如果不满足判断第二个条件elif,如果都不满足执行else
if 测试语句1
then
语句2
elif 测试语句3
then
语句4
else
语句5
fi
执行:首先判断测试语句1是否满足,如果满足执行语句2后结束if,如果if测试语句为假,则继续判断测试语句3,如果测试语句3为真,执行语句4后结束if语句,如果条件都不满足则执行else中的语句5;elif可以有多个。
练习:学生成绩的等级打印,如果输入的成绩是100到90之间则打印A等,如果是80到89则打印b等,如果是70到79打印c等,剩下所有的都是d等,输入成绩只可以是0到100之间。
echo "请输入成绩"
read score
if test $score -ge 90 -a $score -le 100
then
echo "你的成绩${score} 是A等"
elif test $score -ge 80 #如果第一个条件不满足则成绩一定小于90
then
echo "你的成绩${score} 是B等"
elif test $score -ge 70
then
echo "你的成绩${score} 是C等"
else
echo "你的成绩${score} 是D等"
fi
4.if的嵌套:在if中还有if else
格式:
if 测试语句1
then
if 测试语句2
then
语句3
else
语句4
fi
elif 测试语句5
then
语句6
else
语句7;
fi
执行: 先判断测试语句1是否满足,如果满足则继续判断测试语句2,如果测试语句2满足则执行语句3后退出外部if,如果测试语句2不满足,
练习: 输入一个年份,判断是否为闰年(年份可以被4整除,不可以被100整除的年份,或者可以被400整除)
read year
num1=`expr $year % 4`
num2=`expr $year % 100`
num3=`expr $year % 400`
if [ $num3 -eq 0 ] #可以被400整除
then
echo "${year}是闰年"
else
if [ $num1 -eq 0 ]
then
if [ $num2 -ne 0 ]
then
echo "${year}是闰年"
else
echo "${year}不是闰年"
fi
else
echo "${year}不是闰年"
fi
fi
5.while循环语句
1>循环语句:不断的执行某一些代码。
2>格式: while 测试语句
do
循环体
done
3>c语言中:
while(判断语句)
{
循环体
}
4>执行:先判断测试语句是否为真,如果为真则执行循环体代码,然后继续判断测试语句是否为真一直执行循环体,直到测试语句为假则结束
练习:请用while循环计算1到100的和
#! /bin/bash
num=0
sum=0
while [ $num -lt 100 ]
do
num=`expr $num + 1`
sum=`expr $sum + $num`
done
echo "$sum"
5.until循环
格式: until 测试语句
do
循环体
done
特点: 条件不满足则执行循环体,条件满足则退出循环。
练习:请用until循环,计算1到100的奇数和。
6.for循环
格式: for 变量 in 列表
do
循环体
done
执行:每次从值列表中取出一个值存入到变量中,进入循环体执行代码,知道所有列表中的值被取出。
退出循环:break和continue。
练习: 请用for循环打印出所有的参数。例如 ./abc.sh 1 2 a d dsd
temp=1
for num in $*
do
echo "第${temp}个参数是${num}"
temp=`expr $temp + 1`
done
练习: 请打印当前目录下的文件和目录,如果是文件 在最后面加[文件],如果是目录则在目录最后面加上[目录]
#!/bin/bash
for num in `ls ~` #只可以在当前目录
do
if [ -f $num ]
then
echo "${num}[文件]"
elif [ -d $num ]
then
echo "${num}[目录]"
else
echo "${num}[什么都不是]"
fi
done
7.函数
函数:一块代码的封装,方便使用,减少代码量,使代码模块化。
格式: function 函数名()
{
函数体;
}
调用: 函数名; 直接 ·使用函数名的方式调用函数。
注意:function可以省略。
8.数组
定义: 多个数据的集合,使用方便,一个名字加下标就表示一个变量
格式:数组名=(值1 值2)
使用:${数组名[下标]} 例如 arr=(1 2 'a') echo "${ar[0]}"
赋值:数组名[下标]=值 ;可以修改数组中的值。
注意:下标从0开始,arr[0]表示第一个元素。在数组中可以有多中数据类型。
练习
1 #! /bin/bash
2
3 myarr=(1 2 'a' "sdg") #定义一个数组
4 echo "${myarr[4]}"
5 myarr[4]=danny #给元素赋值
6
7 echo "${myarr[4]}"
8 #打印所有元素
9 for temp in ${myarr[@]}
10 do
11 echo $temp
12 done
13 echo "${#myarr[4]}" #获取单个元素的长度
14 echo "${myarr[@]}" #表示所有的参数
~
作业1:打印九九乘法表(用到循环嵌套)--- 罗泽成批改
#九九乘法表
for i in {1..9}
do
for j in {1..9}
do
n=`expr $i \* $j`
echo -n "$i * $j =$n "
if test $j -ge $i
then
echo
break
fi
done
done
作业2:写一个函数,用来计算两个数的和以及两个数的差,例如传入的参数是1 + 1 则打印出2,如果是1 + a则提示输入错误。如果传入 1 - 3则打印-2,限定只计算加法和减法。 --
[[ ]] 中字符串或者${}变量尽量如未使用"" 双引号扩住的话,会进行模式和元字符匹配
#函数的调用 加法 减法
function add()
{
if [[ $1 =~ ^[a-zA-Z] ]] || [[ $2 =~ ^[a-zA-Z] ]]
then
echo "参数错误"
else
k=`expr $1 + $2`
echo "${1} + ${2} = $k"
fi
}
function sub()
{
if [[ $1 =~ ^[a-zA-Z] ]] || [[ $2 =~ ^[a-zA-Z] ]]
then
echo "参数错误"
else
k=`expr $1 - $2`
echo "${1} - ${2} = $k"
fi
}
echo "算术模式"
if test $2 = "+"
then
add $1 $3
fi
if test $2 = "-"
then
sub $1 $3
fi
本文介绍了Shell脚本中的系统环境变量,如PATH、USER、UID等,并详细讲解了测试语句的用法,包括关系运算符、文件运算符及其在逻辑判断中的应用。通过实例展示了如何找出三个数中的最大值、检查文件权限以及判断文件新旧。此外,文章还涵盖了if分支语句的多种形式,包括嵌套、elif和else的情况。最后,提到了while、until循环和for循环的使用方法,以及函数和数组的概念。通过这些基础知识,读者可以更好地理解和编写Shell脚本。

4904

被折叠的 条评论
为什么被折叠?



