Shell 脚本学习笔记-基础
文章目录
杂记
bash 中,默认数据类型都为字符串。
expr
可以用来判断输入或变量内容是否是数字。expr $num + 1
如果报错,则不是数字,否则就是数字。
expr $num + 1 &> /dev/null
[ $? -ne 0 ] && {
echo "not number"
exit 1
}
常用符号及含义
符号 | 含义 |
---|---|
"" | 使 shell 将双引号中的空格、制表符等大多数的特殊字符按普通字符处理。但是有三种特殊字符依然有特殊含义,分别是 &、\和 ` |
'' (单引号) | 使 shell 将双引号中得所有字符按普通字符处理 |
``(反引号)$() | 作用是把命令的运行输出作为值返回给当前 shell。 eg:a=`ls -a`. `ls -a` 的结果会赋值给a |
\ (反斜杠) | 转义字符(逃脱字符)使其后的特殊符号作为普通字符处理 |
; | 如果要一行写多个命令,命令之间需要用“;”隔开 |
;; | case 语句中用于表示中断(break) |
{} | 创建命令块 |
| (竖杠) | 管道标识符。command1 | command2 表示将 command1 的结果作为 command2 的参数。eg: ls -a | grep "filter" |
$? | 返回上一个命令的运行结果(程序返回值)echo $? |
() | 在子 SHELL 中执行命令。子 SHELL 特点如下:不会阻塞当前任务(可以用来作并发),结束后自动销毁对应环境;子 SHELL 可以访问父 SHELL 的变量和环境变量(继承,因此不能修改父 SHELL 中变量),父 SHELL 不能访问子 SHELL 内部变量; |
$@ | 获取所有参数形成一个集合,可以使用 forin 进行遍历 |
$* | 将所有参数拼成一个字符串返回 |
$# | 获取输入参数的数量 |
字符串处理
条件判断
[ ]
和[[ ]]
的区别在于在[[ ]]
中的逻辑判断可以直接使用 ||、&&*。同时[[]]
过于强大不好掌握[]
这种形式是test
命令的变形,也可以写成if test a -nq b
,等价于if [ a -nq b ]
- 除了
[]
,字符串处理${}
也包含逻辑处理参数。例如,给变量提供默认值。详见《SHELL 字符串处理》
符号 | 含义 |
---|---|
字符串比较 | |
str1 = str2 | 判断两个字符串是否相等 |
str1 != str2 | 两个字符串不等时为真 |
-n str1 | str1长度大于0时为真 |
-z str1 | str1长度为0时为真 |
数值比较 | |
int1 -eq int2 | 相等为真 |
int1 -ne int2 | 不相等为真 |
int1 -gt int2 | int1 > int2 为真(great than) |
int1 -ge int2 | int1 >= int2 为真(great or equal) |
int1 -lt int2 | int1 < int2 为真(less than) |
int1 -le int2 | int1 <= int2 为真(less or equal) |
文件判断 | |
-e file | 文件存在为真(exist) |
-d file | 文件存在并且是一个目录为真(dictionary) |
-r file | 文件存在并且可读为真(readable) |
-w file | 文件存在并且可写为真(writable) |
-x file | 文件存在并且可执行为真(executable) |
file1 -nt file2 | file1比file2新为真(new than) |
file1 -ot file2 | file1比file2旧为真(older than) |
file1 -ef file2 | file1和file2是同一个文件为真(equal file) |
express1 -a express2 | 两个表达式同为真则为真(and)(&&) |
express1 -o express2 | 至少有一个真则为真(or)(||) |
更多资料 |
流程控制
if
if [ logic1 ];then
//someting to do
elif [ logic2 ]
//someting to do
else
//someting to do
fi
for
# 1.
for arg in aSet;do
//something to do
done
# 2.
for (( i=start; i<end; i++ ));do
//something to do
done
while
while [ logic ];do
//something to do
done
case
case word in
pattern1 )
//something to do
;;
pattern2 )
//something to do
;;
* )
//something to do
;;
esac
在case语句中 pattern 如果表示为 [Yy]
表示如果 word 为 Y
或者 y
则进入这个 case,即单字符匹配
Tips:
如果在执行过程中需要以新的参数重新运行脚本,可以使用“$0 param”的方式
函数
shell 自定义函数可以看成自定义了一个新的命令,这个命令的作用范围为定义开始至脚本结束。
所以运行函数的时候可以像命令一样传入参数:Function param1 param2 …
对于参数的处理可以使用 $1
,$2
,$@
等获取参数和参数相关信息。
格式:
[function] name()
{
# body
}
参数
对于参数的处理可以使用 $1
,$2
,$@
等获取参数和参数相关信息。
关键词
关键词 | 含义 |
---|---|
return value | 返回函数的运行状态。非必需 |
local var=something | 标志“var”为局部变量。仅可在函数内部使用 |
echo | 函数中返回值到运行该函数的位置 |
返回值
脚本中使用 exit <value>
可以退出当前脚本(或者等执行完自动结束),在函数中可以使用 return <value>
方式结束一个函数(或者函数执行完自动结束),“return value”来返回函数的执行状态,返回的“value”可以通过 $?
来获取。“value”的范围为:0-255
#!/bin/sh
testFunc()
{
echo "112233"
return 200
}
case $1 in
"--start" )
result=$(testFunc);
echo "returnCode=$?"
echo "result=$result"
;;
* )
echo "param error"
;;
esac
# 结果输出:
# returnCode=200
# result=112233
调用其他 shell 脚本中的函数
注意:当引入的脚本中有同名函数时,后引入的会覆盖先引入的
SHELL 中常见的算术运算命令
运算操作符与运算命令 | 意义 | Demo |
---|---|---|
(()) | 用于整数运算的常用运算符,效率高 | ((i=i+1)) ,aa=$((i+1)) ,echo $((2+1)) ,((8>7&&5==5)) |
let | 用于整数运算,类似于 (()) | let num=num+1 |
expr | 可用于整数运算,除此之外还有其他功能 | expr 3 + 5 |
bc | Linux 下的一个计算器程序(适合整数及小数运算) | |
$[] | 用于整数运算 | |
awk | 既可以用于整数运算,也可以用于小数运算 | |
declare | 定义变量值和属性。-i 参数可以用于定义整形变量,做运算 |