【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"
注意:单引号中的变量是无效的,双引号中的可使用转义字符
获取字符串长度 A=B echo ${#A}
提取子串 A=B echo ${A:1:4}
查找子串 A=B 此处的是反引号不是单引号 echo
expr index "$A"
shell 数组
三、shell 基础运算符
算数运算符shell原生不支持数学计算,可通过awk或expr实现,或者使用(()),在内层小括号内,使用C的语法实现。使用expr时,\`为反引号而不是单引号
val=`expr 2 + 2`
关系运算符
注意:只支持数字,不支持字符串,除非字符串的值是数字
-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专栏。