1、如果想要计算含有小数点的数据,可以通过bc命令辅助。
例如:
[root@vidar-ali ~]# echo "11.11*12.12" | bc
134.65
[root@vidar-ali ~]# echo "scale=4;11.11*12.12" | bc
134.6532
2、BC命令
bc命令是一种支持任意精度的交互执行的计算器语言。是Linux简单的计算器,能进行进制转换与计算。能转换的进制包括十六进制、十进制、八进制、二进制等。可以使用的运算符号包括(+)加法、(-)减法、(*)乘法、(/)除法、(^)指数、(%)余数
语法(选项)
-i:强制进入交互式模式;
-l:定义使用的标准数学库;
-w:对POSIX bc的扩展给出警告信息;
-q:不打印正常的GNU bc环境信息;
-v:显示指令版本信息;
-h:显示指令的帮助信息。
3、脚本执行方式的差异
①sh script 和 ./script 在子进程的bash内执行(不论是绝对路径/相对路径还是${PATH}内)
②source 在父进程中执行(或 . script)
4、test命令测试功能
①关于某个文件名的"文件类型"的判断:test -e filename
-e 判断该文件名是否存在
-f 判断该文件名是否存在且为文件(file)
-d 判断该文件名是否存在且为目录(directory)
-b 判断该文件名是否存在且为一个block device设备
-c 判断该文件名是否存在且为一个character device设备
-S 判断该文件名是否存在且为一个Socket文件
-p 判断该文件名是否存在且为一个FIFO(pipe)文件
-L 判断该文件名是否存在且为一个连接文件
②关于某个文件名的权限检测:test -r filename
-r 检测该文件名是否存在且具有可读的权限
-w 检测该文件名是否存在且具有可写的权限
-x 检测该文件名是否存在且具有可执行的权限
-u 检测该文件名是否存在且具有"SUID"的属性
-g 检测该文件名是否存在且具有"SGID"的属性
-k 检测该文件名是否存在且具有"Sticky bit"的属性
-s 检测该文件名是否存在且为非空白文件
③连个文件之间的比较:test file1 -nt file2
-nt(newer than) 判断file1是否比file2新
-ot(older than) 判断file1是否比file2旧
-ef 判断file1和file2是否为同一个文件,可用在hard link的判定上 。
④关于两个整数之间的判定:test n1 -eq n2
-eq 两数值相等(equal)
-ne 两数值不等(not equal)
-gt n1大于n2(greater than)
-lt n1小于n(less than)
-ge n1大于等于n2(greater than or equal)
-le n1小于等于n2(less than or equal)
⑤判定字符串的数据
test -z string 判定字符串是否为0,若string为空字符串,则为true
test -n string 判定字符创是否非为0,若String不为空字符串,则为true
test str1=str2 判定字符串str1是否等于str2,若相等,则为true
test str1!=st2 判定字符创Str1是否不等于str2,若不相等,则为true
⑥多重条件判定,例如: test -r filename -a -x filename
-a (and)两状况同时成立!例如test -r file -a -x file,则file 同时具有r 与x 权限时,才回传true。
-o (or)两状况任何一个成立!例如test -r file -o -x file,则file 具有r 或x 权限时,就可回传true。
! 反相状态,如test ! -x file ,当file 不具有x 时,回传true
5、利用判断符号[ ],中括号的两端需要有空白字符来分隔
6、判断符号[ ]注意事项:
①在中括号[ ]内的每个组件都需要有空格来分隔;
②在中括号内的变量,最好都以双括号括号起来;
③在中括号内的常数,最好都以单或双引号括号起来。
例如:
如果:
name="hello world"
[ ${name} == "test" ]
系统会以为:
[ hello world == "test"]
不符合要求。
因此需要:
[ "${name}" == "test" }
结果为:
[ "hello world" == "test"]
7、中括号的判断案例
#!/bin/bash
read -p "请输入Y/N:" yn
[ "${yn}" == "Y" -o "${yn}" == "y" ] && echo "ok" && exit 0
[ "${yn}" == "N" -o "${yn}" == "n" ] && echo "no" && exit 0
echo "我不知道你在说什么" && exit 0
8、shell脚本的默认变量
$0 代表执行脚本的名字
$1、$2、$3 分别代表各个顺序的参数(第一个参数、第二个参数以及第三个参数)
$@ 代表$1、$2、$3之意,每个变量都是独立的(用双引号括起来)
$# 代表参数的个数
$$ 代表当前脚本的运行进程ID(PID)
$? 代表执行完上一个指令的执行结果
例如:
#!/bin/bash
echo "脚本名字为: ${0}"
echo "脚本参数个数:${#}"
[ "${#}" -lt 2 ] && echo "参数至少为2个,停止执行" && exit 0
echo "你的参数内容:'${@}'"
echo "第一个参数为:${1}"
echo "第二个参数为:${2}"
输出结果为:
[root@vidar-ali ~]# bash how.sh a b c d
脚本名字为: how.sh
脚本参数个数:4
你的参数内容:'a b c d'
第一个参数为:a
第二个参数为:b
9、shift造成参数变量号码偏移
例如:
#!/bin/bash
echo "脚本参数为: ${@}"
echo "脚本参数个数:${#}"
shift
echo "脚本参数为: ${@}"
echo "脚本参数个数:${#}"
shift 3
echo "脚本参数为: ${@}"
echo "脚本参数个数:${#}"
执行结果为:
[root@vidar-ali ~]# bash how_shift.sh a b c d e f g
脚本参数为: a b c d e f g
脚本参数个数:7
脚本参数为: b c d e f g
脚本参数个数:6
脚本参数为: e f g
脚本参数个数:3
10、条件判断式if…then
基本语法:
#多个条件判断 (if ... elif ... elif ... else) 分多种不同情况执行
if [ 条件判断式一 ]; then
当条件判断式一成立时,可以进行的指令工作内容;
elif [ 条件判断式二 ]; then
当条件判断式二成立时,可以进行的指令工作内容;
else
当条件判断式一与二均不成立时,可以进行的指令工作内容;
fi
你得要注意的是, elif 也是个判断式,因此出现 elif 后面都要接 then 来处理!但是 else 已经是最后的没有成立的结果了, 所以 else 后面并没有 then 。
例如(一定要注意使用双引号):
#!/bin/bash
if [ "${1}" == "hello" ];then
echo "hello ,how are you"
elif [ "${1}" == "" ];then
echo "no empty"
else
echo "error"
fi
结果如下:
[root@vidar-ali ~]# bash hello.sh hello
hello ,how are you
[root@vidar-ali ~]# bash hello.sh hell
error
[root@vidar-ali ~]# bash hello.sh
no empty
11、利用case…esac判断
case $变量名称 in <==关键词为 case ,还有变量前有钱字号
"第一个变量内容") <==每个变量内容建议用双引号括起来,关键词则为小括号 )
程序段
;; <==每个类别结尾使用两个连续的分号来处理!
"第二个变量内容")
程序段
;;
*) <==最后一个变量内容都会用 * 来代表所有其它值
不包含第一个变量内容与第二个变量内容的其它程序执行段
exit 1
;;
esac <==最终的 case 结尾!”反过来写”思考一下!
一般来说,使用【case $变量 in 】这个语法时,变量大致有两种获取方式:①直接执行式,脚本传参的方法。②交互式,通过read命名。
12、function功能简介
语法:
function fname(){
程序段
}
在shell脚本中,function的设置一定要在程序的最前面,这与很多程序语言不一样。
13、不定循环
①当 condition 条件成立时,就进行回圈,直到 condition 的条件不成立才停止:
while [condition] -->中括号内的状态就是判断式
do -->回圈的开始
程序段落
done -->回圈的结束
②当 condition 条件成立时,就终止回圈,否则就持续进行回圈的程序段:
until [condition]
do
程序段
done
实例一:
#!/bin/bash
#Repeat question until input correct answer.
while [ "$yn" != "yes" -a "$yn" != "YES" ]
do
read -p "Please input yes/YES to stop this program:" yn
done
echo "Oh,you input the correct answer!"
实例二:
#!/bin/bash
#Repeat question until user input the correct answer!
until [ "$yn" == "yes" -o "$yn" == "YES" ]
do
read -p "Please input yes/YES to stop this program:" yn
done
echo "oh,you input the correct answer!"
14、for…do…done(固定循环)
语法:
for var in con1 con2 con3 ...
do
程序段
done
15、除了在for语言中,循环用$(1 100)之外,bash内置机制支持{1…100}这种形式
16、for…do…done支持数值处理,格式如下:
for (( 初始值;限制值;赋值运算))
do
程序段
done
17、shell脚本的跟踪与调试
[root@linux ~]# sh [-nvx] scripts.sh
参数:
-n :不要执行脚本,仅查询语法问题。
-v:在执行脚本前,先将脚本的内容输出至屏幕上。
-x:将使用的脚本内容显示到屏幕上。
18、shell脚本命令是从上而下、从左而右地分析与执行。
19、shell脚本的执行,至少需要r权限,如果需要直接执行命令,需要r和x权限。
参考博客:
https://www.jianshu.com/p/a3f7232fc0dd
https://blog.youkuaiyun.com/zhuying_linux/article/details/6760747