shell脚本编辑(小白基础学习)
一、Shell的格式化输出printf
1.1 语法格式:
printf "指定的格式" "文本1" "文本2" .....
1.2 常用格式替换符:
替换符 | 功能 |
%s | 字符串 |
%f | 浮点格式,保留小数点位数%.nf,n为数字 |
%b | 相对应的参数中包括转义字符时,可以使用此替换符进行替换,对应的转义字符会被转义 |
%c | ASCII字符,即显示对应参数的第一个字符 |
%d,%i | 十进制整数 |
%o | 八进制值 |
%u | 不带正负号的十进制值 |
%x | 十六进制值(a-f) |
%X | 十六进制值(A-F) |
%% | 表示%本身 |
说明:%s中的数字代表此替换符中的输出字符宽度,不足补空格,默认是右对齐,%-10s表示10个字符宽,-表示左对齐
1.3 常用转义字符
转义符 | 功能 |
\a | 警告字符,通常为ASCII的BEL字符 |
\b | 后退 |
\n | 换行 |
\r | 回车 |
\t | 水平制表符 |
\v | 垂直制表符 |
\f | 换页 |
\\ | 表示\\本身 |
案例:
[root@bogon ~]# printf "%s\n" 1 2 3 4
1
2
3
4
[root@bogon ~]# printf "%f\n" 1 2 3 4
1.000000
2.000000
3.000000
4.000000
[root@bogon ~]# printf "%.2f\n" 1 2 3 4 #.2f
1.00
2.00
3.00
4.00
root@bogon ~]# printf " (%s) " 1 2 3 4;echo " "(1) (2) (3) (4)
[root@bogon ~]# printf " (%s) (%s)\n" 1 2 3 4;echo " "(1) (2)(3) (4)[root@bogon ~]# printf " %s %s\n" 1 2 3 4;echo " "1 23 4[root@bogon ~]# printf " %s %s\n" 1 2 3 41 23 4
[root@bogon ~]#
#%-10s表示宽度10个字符,左对齐
二、Shell脚本语言的运算
2.1 算数运算
shell支持算术运算,但只支持整数,不支持小数
2.2 Bash中的算术运算
-- + 加法运算
-- - 减法运算
-- * 乘法运算
-- / 除法运算
-- % 取模,即取余数
-- ** 乘方
#乘法符号在有些场景需要转义
2.3实现算术运算
1. let var=算术表达式
2. var=$[算术表达式]
3. var=$((算术表达式))
4. var=$(expr arg1 arg2 arg3 ...)
5. declare -i var = 数值
6. echo '算术表达式' | bc (支持浮点数)
实例:使用bc计算小数和declare -i计算
[root@bogon ~]# echo "scale=3;20/3"|bc
6.666
[root@bogon ~]# echo "scale=3;2/3"|bc
.666
[root@bogon ~]# i=20
[root@bogon ~]# j=20
[root@bogon ~]# declare -i sum=i*j
[root@bogon ~]# echo $sum
400
[root@bogon ~]#
内建的随机数生成器变量:
$RANDOM 取值范围:0-32767
实例:生成0-49之间的随机数
[root@bogon ~]# echo $[$[$RANDOM%50]+1]
15
[root@bogon ~]# echo $[$RANDOM%50]
33
[root@bogon ~]# echo $[RANOM % 100 + 1]
1
实例:生成随机颜色字符串
root@bogon ~]# echo -e "\033[1;$[RANDOM%7+31]mStudy\033[0m"
Study
[root@bogon ~]# echo -e "\033[1;$[RANDOM%7+31]mStudy\033[0m"
Study
[root@bogon ~]#
[root@bogon ~]# echo -e "\033[1;$[RANDOM%7+31]mStudy\033[0m"
Study
2.4增强型赋值:
+=
i+=10 <==> i=1+10
-=
i-=j <==> i=i-j
*=
/=
%=
++
i++,++1 <==> i=i+1 (自增)
--
i--,--i <==> i=i-1 (自减)
格式:
let varOPERvalue
[root@bogon ~]# let var=1
[root@bogon ~]# echo $var
1
[root@bogon ~]# let var++
[root@bogon ~]# echo $var
2
[root@bogon ~]# echo $var--
2--
[root@bogon ~]# echo $var
2
[root@bogon ~]# let var--
[root@bogon ~]# echo $var
1
[root@bogon ~]# unset i j ;i=1;let j=i++;echo "i=$i,j=$j"
i=2,j=1# i++ 与 ++i的区别:
i++ 先赋值再运算
++i 先运算再赋值
实例:鸡兔同笼问题
[root@bogon ~]# mkdir -p shell
[root@bogon ~]# vim shell/chicken.sh
#!/bin/bash
HEAD=35
FOOT=94RABBIT=$(((FOOT-HEAD-HEAD)/2))
CHOOK=$[35-RABBIT]
echo "兔子的数量为:"$RABBIT
echo "鸡的数量为: "$CHOOK
[root@bogon ~]# chmod +x shell/chicken.sh
[root@bogon ~]# shell/chicken.sh
兔子的数量为:12
鸡的数量为: 23
计算出所有人的年龄总和
[root@ansible-salve1 shell]# vim nianling.txt
[root@ansible-salve1 shell]# cat nianling.txt
a=20
b=18
c=22
[root@ansible-salve1 shell]# cut -d"=" -f2 nianling.txt
20
18
22
[root@ansible-salve1 shell]# cut -d"=" -f2 nianling.txt | tr '\n' + | grep -Eo ".*[0-9]" | bc
60
[root@ansible-salve1 shell]# grep -Eo "[0-9]+" nianling.txt
20
18
22
[root@ansible-salve1 shell]# grep -Eo "[0-9]+" nianling.txt | tr '\n' +| grep -Eo ".*[0-9]" | bc
60
[root@ansible-salve1 shell]#