AI学习者 · 2021年08月13日

Linux的Shell编程语法集锦

【GiantPandaCV导语】相信在linux服务器环境下完成算法开发和部署的同学,都有使用shell来实现部分自动化功能的经历,本文就来给大家分享我总结的一些shell语法知识,希望对大家有帮助。

一、shell文件运行

写好的文件保存为*.sh 文件加好运行权限后,就是可以用Bash运行的脚本程序了

chmod +x yourshell.sh
./yourshell.sh

二、shell 变量

命名格式 A=B 或用循环等语句给变量赋值

注意:变量名和等号之间不能有空格

使用时:echo $A或 echo ${A},花括号用来确认变量范围(可选)
只读变量:A=B readonly A
删除变量:unset A

变量类型:

1)局部变量  仅当前shell实例中有效

2)环境变量  全局的变量,比如用export声明的,或者在bashrc文件里或者/etc/profile文件里的

3)shell变量  由shell程序设置的特殊变量

shell 字符串

A='B' 或 A="B"

注意:单引号中的变量是无效的,双引号中的可使用转义字符

image.png

获取字符串长度 A=B echo ${#A}

提取子串 A=B echo ${A:1:4}

查找子串 A=B  此处的是反引号不是单引号 echo expr index "$A"

shell 数组

image.png

三、shell 基础运算符

算数运算符shell原生不支持数学计算,可通过awk或expr实现,或者使用(()),在内层小括号内,使用C的语法实现。使用expr时,\`为反引号而不是单引号

val=`expr 2 + 2`

image.png

关系运算符

注意:只支持数字,不支持字符串,除非字符串的值是数字
-eq  是否相等
-ne  是否不相等
-gt  左边是否大于右边
-lt   左边是否小于右边
-ge 左边是否大于等于右边 
-le  左边是否小于等于右边

布尔运算符

! 非
-o 或
-a 与

逻辑运算符

&& 逻辑的AND
|| 逻辑的OR

字符运算符

= 相等
!= 不相等
-z 长度为0
-n 不为0长度
$  是否为空

文件测试运算符

文件测试运算符用于检测 Unix 文件的各种属性。
-b file 检测文件是否是块设备文件,如果是,则返回 true。   [ -b $file ] 返回 false。
-c file 检测文件是否是字符设备文件,如果是,则返回 true。 [ -c $file ] 返回 false。
-d file 检测文件是否是目录,如果是,则返回 true。         [ -d $file ] 返回 false。
-f file 检测文件是否是普通文件(既不是目录,也不是设备文件),如果是,则返回 true。 [ -f $file ] 返回 true。
-g file 检测文件是否设置了 SGID 位,如果是,则返回 true。 [ -g $file ] 返回 false。
-k file 检测文件是否设置了粘着位(Sticky Bit),如果是,则返回 true。 [ -k $file ] 返回 false。
-p file 检测文件是否是有名管道,如果是,则返回 true。     [ -p $file ] 返回 false。
-u file 检测文件是否设置了 SUID 位,如果是,则返回 true。 [ -u $file ] 返回 false。
-r file 检测文件是否可读,如果是,则返回 true。           [ -r $file ] 返回 true。
-w file 检测文件是否可写,如果是,则返回 true。           [ -w $file ] 返回 true。
-x file 检测文件是否可执行,如果是,则返回 true。                  [ -x $file ] 返回 true。
-s file 检测文件是否为空(文件大小是否大于0),不为空返回 true。 [ -s $file ] 返回 true。
-e file 检测文件(包括目录)是否存在,如果是,则返回 true。 [ -e $file ] 返回 true。

四、shell echo

read name 类似python的input函数,可以用来获取输入值echo -e "ok! \n" -e 开启转义\c 不换行\n 换行

五、shell printf

语法printf format-string [arguments...]举例:printf "test\n"

六、shell test

用于检查某个条件是否成立,可进行数值、字符和文件三方面的测试数值测试-eq 等于则为真-ne 不等于则为真-gt 大于则为真-ge 大于等于则为真-lt 小于则为真-le 小于等于则为真num1=100num2=100if test $[num1] -eq $[num2]then    echo '两个数相等!'else    echo '两个数不相等!'fi代码内的[]中可进行基本的数值运算字符串测试= 等于则为真!= 不相等则为真-z 字符串 字符串的长度为零则为真-n 字符串 字符串的长度不为零则为真num1="alasijia"num2="alasi1jia"if test $num1 = $num2then    echo '两个字符串相等!'else    echo '两个字符串不相等!'fi文件测试-e 文件名 如果文件存在则为真-r 文件名 如果文件存在且可读则为真-w 文件名 如果文件存在且可写则为真-x 文件名 如果文件存在且可执行则为真-s 文件名 如果文件存在且至少有一个字符则为真-d 文件名 如果文件存在且为目录则为真-f 文件名 如果文件存在且为普通文件则为真-c 文件名 如果文件存在且为字符型特殊文件则为真-b 文件名 如果文件存在且为块特殊文件则为真cd /binif test -e ./bashthen    echo '文件已存在!'else    echo '文件不存在!'fi

七、shell 流程控制

if conditionthen   commandelsefiif conditionthen    commandelif condition2then   commandelse   commandfifor var in item1 item2do   commanddonewhile conditiondo   command done

八、函数

[function] funname[()]{  action;  [return int;]}fun(){action}

九、当前脚本包含其他脚本

source tesh.sh 或 . tesh.sh

十、shell中双括号,双中括号的含义

详见:https://www.jb51.net/article/...

十一、示例demo

这里引用MIT课程里的一个脚本,该课程名称为《The Missing Semester of Your CS Education》大家可以上网搜索的到,加上注释帮助大家理解

#!/bin/bash echo $(ls)    # 执行ls命令并打印执行结果,这里就是打印当前文件夹下的所有文件echo "Starting program at $(date)" # 这句会首先执行data指令来获取当前时间信息并将该信息重定向到当前语句,再打印输出echo "Running program $0 with $# arguments with pid $$"  # 此处的$0会重定向为脚本名,$#会重定向为当前参数数量 $$为当前执行脚本的进程标识号# 此处就是一个for循环,一个一个的拿出调用脚本时传入的参数for file in "$@"; do        grep foobar "$file" > /dev/null 2> /dev/null    # 这里的grep函数是有返回值的,这里的意思是,返回有或者无时重定向到指定位置,无该文件时重定向到另一指定位置    # 这里要注意,中括号和里面的执行指令之间一定要有空格    if [[ $? -ne 0 ]]; then               echo "File $file does not have any foobar, adding one"               echo "# foobar" >> "$file"           fi done

- END -

原文:GiantPandaCV
作者: SDC

推荐阅读

更多嵌入式AI技术干货请关注嵌入式AI专栏。
推荐阅读
关注数
18809
内容数
1352
嵌入式端AI,包括AI算法在推理框架Tengine,MNN,NCNN,PaddlePaddle及相关芯片上的实现。欢迎加入微信交流群,微信号:aijishu20(备注:嵌入式)
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息