1.利用shell脚本编写一个进度条
先介绍一下shell中printf命令的使用方法,与C语言风格类似,只不过在shell中是一个命令,所以不能通过圆括号传参,所有的参数用双引号括起来,第一个参数是格式控制,与C一致,参数之间不能用逗号,像命令传参一样,用空格隔开。
为了进度条能稍微美观一点,我们可以设置字体的颜色和背景色。在shell中,怎么做到呢?
颜色是通过添加专用序列来选择的 -- 夹在 "\e["和 "m"之间的数字,第一个数字为前景颜色;第二个数字为背景颜色,颜色之间用分号隔开。 使用"\e[0m"序列将颜色重新设置为正常值。下面是不同数字所代表的颜色:
设置前景色(字体颜色)
"\e[30m" 灰色
"\e[31m" 红色
"\e[32m" 绿色
"\e[33m" 黄色
"\e[34m" 蓝色
"\e[35m" 紫色
"\e[36m" 淡蓝色
"\e[37m" 白色
设置背景色
"\e[40m" 灰色
"\e[41m" 红色
"\e[42m" 绿色
"\e[43m" 黄色
"\e[44m" 蓝色
"\e[45m" 紫色
"\e[46m" 淡蓝色
"\e[47m" 白色
#!/bin/bash
i=0
str=""
arr=("\\" "|" "-" "/")
while [ KaTeX parse error: Undefined control sequence: \e at position 179: …hljs-string">"[\̲e̲[32;43;1m%-100s…{str}" “
i
<
/
s
p
a
n
>
"
<
/
s
p
a
n
>
<
s
p
a
n
c
l
a
s
s
=
"
h
l
j
s
−
s
t
r
i
n
g
"
>
"
<
s
p
a
n
c
l
a
s
s
=
"
h
l
j
s
−
v
a
r
i
a
b
l
e
"
>
{i}</span>"</span> <span class="hljs-string">"<span class="hljs-variable">
i</span>"</span><spanclass="hljs−string">"<spanclass="hljs−variable">{arr[${index}]}”
sleep 0.1
let i++
str+="#"
done
效果图:
2. 传入至少两个数字参数到脚本file,并计算出最大值,最小值,平均值。需要判断传入的数字是否足够,否则输出警告信息。平均值保留两位小数。
#!/bin/bash
if [ $# -eq 0 ];then
echo "you must input at least 2 argv"
fi
max=$1
min=
1
<
/
s
p
a
n
>
i
=
0
s
u
m
=
0
<
s
p
a
n
c
l
a
s
s
=
"
h
l
j
s
−
k
e
y
w
o
r
d
"
>
f
o
r
<
/
s
p
a
n
>
i
<
s
p
a
n
c
l
a
s
s
=
"
h
l
j
s
−
k
e
y
w
o
r
d
"
>
i
n
<
/
s
p
a
n
>
<
s
p
a
n
c
l
a
s
s
=
"
h
l
j
s
−
v
a
r
i
a
b
l
e
"
>
1</span> i=0 sum=0 <span class="hljs-keyword">for</span> i <span class="hljs-keyword">in</span> <span class="hljs-variable">
1</span>i=0sum=0<spanclass="hljs−keyword">for</span>i<spanclass="hljs−keyword">in</span><spanclass="hljs−variable">@
do
if [
m
a
x
<
/
s
p
a
n
>
−
l
t
<
s
p
a
n
c
l
a
s
s
=
"
h
l
j
s
−
v
a
r
i
a
b
l
e
"
>
max</span> -lt <span class="hljs-variable">
max</span>−lt<spanclass="hljs−variable">i ];then
let max=i
fi
if [
m
i
n
<
/
s
p
a
n
>
−
g
t
<
s
p
a
n
c
l
a
s
s
=
"
h
l
j
s
−
v
a
r
i
a
b
l
e
"
>
min</span> -gt <span class="hljs-variable">
min</span>−gt<spanclass="hljs−variable">i ];then
let min=i
fi
let sum+=i
done
echo “max:
m
a
x
<
/
s
p
a
n
>
"
<
/
s
p
a
n
>
<
s
p
a
n
c
l
a
s
s
=
"
h
l
j
s
−
b
u
i
l
t
i
n
"
>
e
c
h
o
<
/
s
p
a
n
>
<
s
p
a
n
c
l
a
s
s
=
"
h
l
j
s
−
s
t
r
i
n
g
"
>
"
m
i
n
:
<
s
p
a
n
c
l
a
s
s
=
"
h
l
j
s
−
v
a
r
i
a
b
l
e
"
>
{max}</span>"</span> <span class="hljs-built_in">echo</span> <span class="hljs-string">"min:<span class="hljs-variable">
max</span>"</span><spanclass="hljs−builtin">echo</span><spanclass="hljs−string">"min:<spanclass="hljs−variable">{min}”
echo “ibase=10; scale=2;
s
u
m
<
/
s
p
a
n
>
/
<
s
p
a
n
c
l
a
s
s
=
"
h
l
j
s
−
v
a
r
i
a
b
l
e
"
>
sum</span>/<span class="hljs-variable">
sum</span>/<spanclass="hljs−variable">#” | bc
需要解释一下的是平均值的计算,这里通过管道交给了计算器bc,ibase指定输入数字的进制数,scale指定小数点的位数。
3. 文件内容如下:
123abc456456def123
567abc789
789def567
要求输出:
456ABC123
123DEF456
789ABC567
567DEF789
#!/bin/bash
echo "before"
cat charfile
echo "after"
while read line
do
[ ! -z KaTeX parse error: Expected 'EOF', got '&' at position 15: line</span> ] &̲amp;&{ <sp…line | tr [:lower:] [:upper:] | sed -r ‘s/([0-9]{3})([A-Z]{3})([0-9]{3})/\3\2\1/’
}
done <charfile