shell脚本盲点知识汇总

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值