Shell笔记--使用条件判断和流程控制

Posted 憨豆的小泰迪

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Shell笔记--使用条件判断和流程控制相关的知识,希望对你有一定的参考价值。

1--常用判断条件

        Shell 可通过整数比较、文件权限和文件类型等方面进行判断;

1-1--整数比较

-lt 表示小于(less than);

-le 表示小于等于(less equal);

-eq 表示等于(equal);

-gt 表示大于(greater than);

-ge 表示大于等于(greater equal);

-ne 表示不等于(Not equal);

1-2--文件权限

-r 有读的权限(read);

-w 有写的权限(write);

-x 有执行的权限(execute);

1-3--文件类型

-f 文件存在且是一个常规的文件(file);

-e 文件存在(existence);

-d 文件存在且是一个目录(directory);

1-4--实例测试

基本语法:[ condition ](注意 condition 前后要有空格);

不涉及判断条件时,条件非空即为 true;即[ xxxx ]为 true,[]为 false;

[ 10 -gt 9 ]
echo $?

[ 10 -lt 9 ]
echo $?

[ -e ./test.sh ]

echo $?

2--流程控制

2-1--if判断

        基本语法:

if [ condition ];then
        xxxxx
fi
或
if [condition]
   then
        xxxxx
fi

注意事项:

        [ condition ] 中中括号和条件表达式之间必须有空格;

        if 之后必须有空格;

        实例代码:输入一个数字,若为1,则输出 Hello Shell1;若为2,则输出 Hello Shell2;若为其它,则输出 GoodBye Shell!;

#!/bin/bash

if [ $1 -eq 1 ];then
  echo "Hello Shell1"
elif [ $1 -eq 2 ];then
  echo "Hello Shell2"
else
  echo "GoodBye Shell!"
fi

2-2--case语句

        基本语法:

case $var in
value1)
        xxxxx
;;
value2)
        xxxxx
;;
*)
        xxxxx
;;
esac

        注意事项:

① case 行尾必须为单词 "in",每一个模式匹配必须以右括号 ")" 结束;

② 双分号 ";;" 表示命令序列结束,相当于 break;

③ "*)" 表示默认模式,相当于default;

        代码实例:输入一个数字,若为1,则输出 Hello Shell1;若为2,则输出 Hello Shell2;若为其它,则输出 GoodBye Shell!;

#!/bin/bash

case $1 in
1)
        echo "Hello Shell1"
;;
2)      echo "Hello Shell2"
;;
*)      echo "GoodBye Shell"
;;
esac

2-3--for循环

未完待续!

Shell 学习--流程控制

Shell 学习(三)

流程控制

1 if判断

  • 基本语法
if [ 条件判断式 ];then 
程序
fi

或者

if[ 条件判断式 ]
	then
		程序
		elif[ 条件判断式 ]
			then
				程序
fi

注意事项:(1) [ 条件判断式 ],中括号和条件判断式之间必须要有空格。(2) 推荐使用第二种方式

  • 应用实例

案例: 编写一个shell程序,请输入参数,大于等于60,则输出“及格了”,如果小于60,则输出“不及格”

#!/bin/bash
if [ $1 -ge 60 ]
	then 
		echo "及格了"
elif[ $1 -lt 60]
	then
		echo "不及格"
fi

2 case 语句

  • 基本语法

这个case语法很不一样,我开始很不习惯,有点像C的感觉

case $变量名 in
"值1")
	如果变量的值等于值1,则执行程序1
;;
"值2")
	如果变量的值等于值2,则执行程序2
;;
···省略其他分支···
*)
如果变量的值都不是以上的值,则执行此程序
;;
esac
  • 应用实例

案例:当命令行参数是1时,输出“周一”,当参数是2时,输出“周二”,其他情况输出other。

#!/bin/bash
case $1 in
"1")
	echo "周一"
;;
"2")
	echo "周二"
;;
*)
	echo "other"
;;
esac

3 for循环

  • 基本语法1
for 变量 in 值1 值2 值3 ..
do	
	程序
done

应用实例

打印命令行输入的参数[会使用到$* 和$@]

#!/bin/bash
#使用$*
for i in "$*"
do
	echo "the num is $i"
done

echo "====="
#使用$@
for j in "$@"
do
	echo "the num is $j"
done

执行后为这样:

  • 基本语法2

    这个语法就很像java中的for循环

for((初始值;循环控制条件;变量变化))
do
	程序
done

应用实例:从1加到100的值输出显示

但是这个很奇怪,前面判断条件都是用-gt -ge 来着。这里可以直接用<=

#!/bin/bash
#定义一个变量
SUM=0
for((i=0;i<=100;i++))
do
	SUM=$[$SUM+$i]
done
echo "sum=$SUM"

4 while 循环

  • 基本语法
while [ 条件判断式 ]
do
	程序
done

应用实例

案例:从命令行输入一个数n,统计从1+...+n 的值是多少

#!/bin/bash
SUM=0
i=0
while [$i -le $1]
do
	SUM=$[$SUM+$i]
	i=$[$i+1]
done
echo "sum=$SUM"

2 read 读取控制台输入

2.1 基本语法

read (选项)(参数)
选项:
-p : 指定读取值时的提示符
-t : 指定读取值时等待的时间(秒),如果没有在指定的时间内输入,就不再等待了。
参数:
变量:指定读取参数的变量名

2.2 应用实例

案例一:读取控制台输入一个num 值

案例二:读取控制台输入一个num值,在10秒内输入

#!/bin/bash
read -p "请输入一个数num1="NUM1
echo "你输入的值是num1=$NUM1"
read -t 10 -p "请输入一个数num2="NUM2
echo "你输入的值是num2=$NUM2"

3 函数

3.1 系统函数

  • basename 基本语法
功能:返回完整路径最后 / 的部分,常用于获取文件名
basename[pathname][suffix]
basename[string][suffix](功能描述:basename命令会删掉所有的前缀包括最后一个(\'/\')字符,然后将字符串显示出来)。
选项:
suffix为后缀,如果suffix被指定了,basename会将pathname或string中的suffix去掉
  • dirname 基本语法
功能:返回完整路径最后 / 的前面的部分,常用于返回路径部分
dirname 文件绝对路径(功能描述:从给定的包含绝对路径的文件名中去除文件名(非目录部分),然后返回剩下的路径(目录的部分))

3.2 应用实例

  • 案例1:请返回 /home/aaa/test.txt 的“test.txt” 部分

  • 案例2:请返回 /home/aaa/test.txt 的/home/aaa

3.3 自定义函数

  • 基本语法
[function] funname[()]
{
	Action;
	[return int;]
}

调用直接写函数名 : funname[值]

  • 应用实例
  • 案例1:计算输入两个参数的和(read),getSum
#!/bin/bash
function getSum(){
	SUM=$[$n1+$n2]
	echo "和是=$SUM"
}
read -p "请输入第一个数n1" n1
read -p "请输入第二个数n2" n2

#调用getSum
getSum $n1 $n2

以上是关于Shell笔记--使用条件判断和流程控制的主要内容,如果未能解决你的问题,请参考以下文章

Linux实操篇—— Shell 编程入门变量运算符条件判断流程控制

1 Linux shell 编程:流程控制语句

Linux shell脚本流程控制

shell编程之常用判断条件流程控制IFcaseforWHILE循环read读取控制台输入函数basenamedirname以及自定义函数

Shell 学习--流程控制

Linux | shell脚本-条件判断if和循环语句for