写点什么

Android- 音视频学习系列 -(三)-Shell- 脚本入门,高级安卓工程师面试题

用户头像
Android架构
关注
发布于: 2021 年 11 月 05 日

a 不等于 b


注意:

  • 乘号(*)前边必须加反斜杠()才能实现乘法运算;

  • if...then...fi 是条件语句,后续将会讲解。

  • 在 MAC 中 shell 的 expr 语法是:$((表达式)),此处表达式中的 "*" 不需要转义符号 "" 。


关系运算符:


关系运算符只支持数字,不支持字符串,除非字符串的值是数字。


下表列出了常用的关系运算符,假定变量 a 为 10,变量 b 为 20:



例子:


a=10b=20if [ b ]thenecho "b : a 等于 b"elseecho "b: a 不等于 b"fiif [ b ]thenecho "b: a 不等于 b"elseecho "b : a 等于 b"fiif [ b ]thenecho "b: a 大于 b"elseecho "b: a 不大于 b"fiif [ b ]thenecho "b: a 小于 b"elseecho "b: a 不小于 b"fiif [ b ]thenecho "b: a 大于或等于 b"elseecho "b: a 小于 b"fiif [ b ]thenecho "b: a 小于或等于 b"elseecho "b: a 大于 b"fi


输出:


10 -eq 20: a 不等于 b10 -ne 20: a 不等于 b10 -gt 20: a 不大于 b10 -lt 20: a 小于 b10 -ge 20: a 小于 b10 -le 20: a 小于或等于 b


布尔运算符:


下表列出了常用的布尔运算符,假定变量 a 为 10,变量 b 为 20:



a=10b=20


if [ b ]thenecho "b : a 不等于 b"elseecho "b: a 等于 b"fiif [ b -gt 15 ]thenecho "b 大于 15 : 返回 true"elseecho "b 大于 15 : 返回 false"fiif [ b -gt 100 ]thenecho "b 大于 100 : 返回 true"elseecho "b 大于 100 : 返回 false"fiif [ b -gt 100 ]thenecho "b 大于 100 : 返回 true"elseecho "b 大于 100 : 返回 false"fi


输出:


10 != 20 : a 不等于 b10 小于 100 且 20 大于 15 : 返回 true10 小于 100 或 20 大于 100 : 返回 true10 小于 5 或 20 大于 100 : 返回 false


逻辑运算符:


以下介绍 Shell 的逻辑运算符,假定变量 a 为 10,变量 b 为 20:



例子:


a=10b=20if [[ a -lt 100 && b -gt 100 ]]thenecho "返回 true"elseecho "返回 false"fi


if [[ b -gt 100 ]]thenecho "返回 true"elseecho "返回 false"fi


输出:


返回 false 返回 true


字符串运算符


下表列出了常用的字符串运算符,假定变量 a 为 "123",变量 b 为 "456":



例子:


str1="123"str2="456"


if [ str2 ]thenecho "str2 : str1 等于 str2"elseecho "str2: str1 不等于 str2"fiif [ str2 ]thenecho "str2 : str1 不等于 str2"elseecho "str2: str1 等于 str2"fiif [ -z str1 : 字符串长度为 0"elseecho "-z str1" ]thenecho "-n str1 : 字符串长度为 0"fiif [ str1 : 字符串不为空"elseecho "$str1 : 字符串为空"fi


输出:


123 = 456: str1 不等于 str2123 != 456 : str1 不等于 str2-z 123 : 字符串长度不为 0-n 123 : 字符串长度不为 0123 : 字符串不为空


文件测试运算符:


文件测试运算符用于检测 Unix 文件的各种属性。


属性检测描述如下:



其他检查符:


  • -S: 判断某文件是否 socket。

  • -L: 检测文件是否存在并且是一个符号链接。


变量 file 表示文件 /root/android/shell/test.sh,它具有 rwx 权限。下面的代码,将检测该文件的各种属性:


file="/root/android/shell/test.sh"if [ -r file ]thenecho "文件可写"elseecho "文件不可写"fiif [ -x file ]thenecho "文件为普通文件"elseecho "文件为特殊文件"fiif [ -d file ]thenecho "文件不为空"elseecho "文件为空"fiif [ -e $file ]thenecho "文件存在"elseecho "文件不存在"fi


输出:


文件可读文件可写文件可执行文件为普通文件文件不是个目录文件不为空文件存在

echo 命令

Shell 的 echo 指令用于字符串的输出。命令格式:


echo string


例子


#显示普通字符串 echo "This is a book"#也可以省略双引号 echo This is a book#显示转义字符 echo""This is a book""#显示变量 your_name_2="DevYK_2"echo "变量的名称是:$your_name_2"#显示换行 -e 开始转义 echo -e "换行 \n"echo "是否换行了"#显示不换行 echo -e "不换行 \c"echo "是否换行了"#显示命令执行结果 echo date


输出:


This is a bookThis is a book"This is a book"变量的名称是:DevYK_2 换行


是否换行了不换行 是否换行了 Mon Jan 13 12:12:32 CST 2020

printf 命令

上一章节我们学习了 Shell 的 echo 命令,本章节我们来学习 Shell 的另一个输出命令 printf。


printf 命令模仿 C 程序库(library)里的 printf() 程序。


printf 由 POSIX 标准所定义,因此使用 printf 的脚本比使用 echo 移植性好。


printf 使用引用文本或空格分隔的参数,外面可以在 printf 中使用格式化字符串,还可以制定字符串的宽度、左右对齐方式等。默认 printf 不会像 echo 自动添加换行符,我们可以手动添加 \n。


printf 命令的语法:


printf format-string [arguments...]


参数说明:


  • format-string: 为格式控制字符串

  • arguments: 为参数列表。


例子:


printf "%-10s %-8s %-4s\n" 姓名 性别 体重 kg


printf "%-10s %-8s %-4.2f\n" 郭靖 男 66.1234printf "%-10s %-8s %-4.2f\n" 杨过 男 48.6543printf "%-10s %-8s %-4.2f\n" 郭芙 女 47.9876


输出:


姓名 性别 体重 kg 郭靖 男 66.12 杨过 男 48.65 郭芙 女 47.99


%s %c %d %f 都是格式替代符


%-10s 指一个宽度为 10 个字符(-表示左对齐,没有则表示右对齐),任何字符都会被显示在 10 个字符宽的字符内,如果不足则自动以空格填充,超过也会将内容全部显示出来。


%-4.2f 指格式化为小数,其中.2 指保留 2 位小数。

test 命令

Shell 中的 test 命令用于检查某个条件是否成立,它可以进行数值、字符和文件三个方面的测试。


数值测试:



例子:


num1=100num2=100if test [num2]thenecho '两个数相等!'elseecho '两个数不相等!'fi


输出:


两个数相等!


字符串测试:



例子:


name_="DEVYK"name2_="DevYK"if test name2_thenecho '两个字符串相等!'elseecho '两个字符串不相等!'fi


输出:


两个字符串不相等!


文件测试:



《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》
浏览器打开:qq.cn.hn/FTe 免费领取
复制代码


-f 文件名 | 如果文件存在且为普通文件则为真 || -c 文件名 | 如果文件存在且为字符型特殊文件则为真 || -b 文件名 | 如果文件存在且为块特殊文件则为真 |


例子:


if test -e ./test.shthenecho '文件已存在!'elseecho '文件不存在!'fi


输出:


文件已存在!

流程控制

和 Java 语言不一样,sh 的流程控制不可为空,如(以下为 Java 流程控制写法):


if(1 == 2){add(1,2)}else{//不做任何处理}


在 sh/bash 里可不能这么写,如果 else 分支没有语句执行,就不要写这个 else。


if 语句语法格式:


if conditionthencommand1command2...commandNfi


写成一行(适用于终端命令提示符):


if [ $(ps -ef | grep -c "ssh") -gt 1 ]; then echo "true"; fi


for 循环:


for var in item1 item2 ... itemNdocommand1command2...commandNdone


例子:


for loop in 1 2 3doecho "the value is $loop"done


输出:


the value is 1the value is 2the value is 3


while 语句


while 循环用于不断执行一系列命令,也用于从输入文件中读取数据;命令通常为测试条件。其格式为:


while conditiondocommanddone


以下是一个基本的 while 循环,测试条件是:如果 int 小于等于 5,那么条件返回真。int 从 0 开始,每次循环处理时,int 加 1 。运行上述脚本,返回数字 1 到 5 ,然后终止。


int=1while(( intlet "int++"done


输出:


12345


无限循环


无限循环语法格式:


while :docommanddone


或者:


while truedocommanddone


或者:


for (( ; ; ))

函数

linux shell 可以用户定义函数,然后在 shell 脚本中可以随便调用。


shell 中函数的定义格式如下:


[ function ] funname [()]


{


action;


[return int;]


}


说明:


  • 1、可以带 function fun() 定义,也可以直接 fun() 定义,不带任何参数。

  • 2、参数返回,可以显示加:return 返回,如果不加,将以最后一条命令运行结果,作为返回值。 return 后跟数值 n(0-255)


例子:


funWithReturn(){echo "这个函数会对输入的两个数字进行相加运算..."echo "输入第一个数字: "read aNumecho "输入第二个数字: "

用户头像

Android架构

关注

还未添加个人签名 2021.10.31 加入

还未添加个人简介

评论

发布
暂无评论
Android-音视频学习系列-(三)-Shell-脚本入门,高级安卓工程师面试题