1# @Time : 2019-12-07
2# @Language: Markdown
3# @Software: VS Code
4# @Author : Di Wang
5# @Email : [email protected]
Shell 脚本编程
一直以来只是使用bash或者zsh,对于shell脚本并不了解,上次组会导师告知可以通过shell script进入epics IOC的shell,进而通过dbl命令获取所有IOC的所有PV,虽然只是获取了PV名,进一步获取PV Type,Value还需要进一步执行dbpr等命令,不过可以先试着玩一下。
关于Shell脚本一些基本介绍此处就忽略了,只记录一些我还不太熟悉的。忽略掉的包括:
- 运行方法
- 注释
- 变量类型,定义与使用
字符串
单引号
1str='this is a string'
- 单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的
- 单引号字串中不能出现单引号(对单引号使用转义符后也不行)
双引号
- 双引号里可以有变量
- 双引号里可以出现转义字符
字符串长度
查找字符串长度
1string="All work no play makes Jack a dull boy"
2echo `expr index "$string" io` # 查找字符 i 或 o 的位置(哪个字母先出现就计算哪个):
数组
1array_name=(value0 value1 value2 value3)
2
3# 使用 @ 或者 * 符号可以获取数组中的所有元素
4echo ${array_name[@]}
5
6# 取得数组元素的个数
7length=${#array_name[@]}
8# 或者
9length=${#array_name[*]}
10# 取得数组单个元素的长度
11lengthn=${#array_name[n]}
| 参数 | 说明 |
|---|---|
| $# | 传递到脚本的参数个数 |
| $* | 以一个单字符串显示所有向脚本传递的参数。如"$*“用「"」括起来的情况、以”$1 $2 … $n"的形式输出所有参数。 |
| $$ | 脚本运行的当前进程ID号 |
| $! | 后台运行的最后一个进程的ID号 |
| $@ | 与$*相同,但是使用时加引号,并在引号中返回每个参数。如"$@“用「"」括起来的情况、以”$1" “$2” … “$n” 的形式输出所有参数。 |
| $- | 显示Shell使用的当前选项,与set命令功能相同。 |
| $? | 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。 |
运算符
常见的一些运算符不列出或者不多加说明了。
表达式和运算符之间要用空格
算术运算的‘=’是赋值,‘==’是比较,字符串运算‘=’是比较。
| 运算符 | 说明 |
|---|---|
| -eq | 相等 |
| -ne | 不相等 |
| -gt | … |
| -lt | … |
| -ge | … |
| -le | … |
| ! | 布尔非 |
| -o | 布尔或 |
| -a | 布尔与 |
| && | 逻辑AND |
| || | 逻辑OR |
| -z | 字符串长度为0? |
| -n | 字符串长度不为0? |
| $ | 字符串为空? |
| -b file | blcok device? |
| -c file | character device? 关于这俩的解释 |
| -d file | 目录 |
| -f file | 普通文件 |
| -g file | 是否设置SGID |
| -k file | 是否设置Sticky Bit |
| -p file | 是否命名管道(Named pipe or FIFO) |
| -u file | 是否设置SUID |
| -r file | 文件可读 |
| -w file | 可写 |
| -x file | 可执行 |
| -s file | 文件为空 |
| -e file | exist? |
| -S file | socket? |
| -L file | exist and link? |
Shell 重定向
文件描述符 0 通常是标准输入(STDIN),1 是标准输出(STDOUT),2 是标准错误输出(STDERR) i.e. 将 stdout 和 stderr 合并后重定向到 file:
command >> file 2>&1
屏蔽 stdout 和 stderr:
command > /dev/null 2>&1
| 命令 | 说明 |
|---|---|
| command > file | 输出重定向到file |
| command < file | 输入重定向到file |
| command » file | 输出追加重定向到file |
| n > file | 文件描述符n重定向到file |
| n » file | 文件描述符n追加重定向到file |
| n >& m | 输出文件n m合并 |
| n <& m | 输入文件n m合并 |
| «tag | tag之间的内容作为输入 |
待补充…
20240320更新:
Default values
${foo:-val}$foo, or val if unset (or null)${foo:=val}Set $foo to val if unset (or null)${foo:+val}val if $foo is set (and not null)${foo:?message}Show error message and exit if $foo is unset (or null)
Omitting the : removes the (non)nullity checks, e.g. ${foo-val} expands to val if unset otherwise $foo.
在这里看到对于shell中的默认值, 有两种写法: ${foo-val}, 对于带不带:二者的区别有点难以理解. 测试后发现区别在于
- 当
foo未定义, 二者相同 - 当
foo=""定义为空, 带:的情况下,foo=val; 不带情况下foo="".
也就是说, 带:应该是更好的习惯.