shell----扩展篇
目录
awk NF 变量的特殊使用方式:
head -3 /etc/passwd|awk -F ":" '{printf $(NF=5)"\n"}'
或
head -3 /etc/passwd|awk -F ":" '{printf $(NF-2)"\n"}'
shell计算:
seq 1 10 {从小到大取1-10}
seq 1 2 10 {2 自增大小}
seq 1 9 | tac {从大到小取1-9}
#tac是把行按照倒叙的方式显示
seq 1 9 | sort -rn
#按照数值大小排序,并倒叙
#取1-10范围内的整数(可直接应用于for的循环结构中)
浮点运算
c=$(echo "scale=2;5.01-4*2.0"|bc)
echo $c
-2.99
echo "scale=1;5/3"|bc
scale 关键词能控制小数点长度,但是不进行四舍五入
c=$(awk 'BEGIN{print 7.01*5-4.01 }')
echo $c
31.04
printf '%.2f\n' $(awk 'BEGIN{printf 2/3}')
数组
数组声明:
declare -a abc
abc[0]=1,abc[1]=2
unset abc
unset abc[1]
数组赋值:
a、
abc=(1 2 3) abc[0]=1;abc[1]=2;abc[2]=3
b、
a="1 2 3"
abc=($a)
abc=($(命令))
调用数组所有值:
echo ${abc[@]}
数组长度获取:
数组长度(元素数=值的个数):
${#abc[@]}
元素长度:{元素长度即为值的长度=值的字符数}
echo ${#abc[1]}
echo ${abc[1]} | wc -L
echo -n ${abc[1]} | wc -L
#去掉换行符再统计
数组遍历:
abc=(1 2 3)
a=0
for i in "${abc[@]}"
do
echo "下标为$a的元素的值为:$i"
let a++
done
数组元素修改:
abc=(1 2 3)
abc[3]=10
abc=(1 2 3)
bcd=(${abc[@]} 4)
echo $(bcd[@])
数组切片:
abc=(1 2 3 4 5 6 7)
${abc[@]}
${abc[@]:1} 2-7
#从下标为1的位置开启取值,取所有
${abc[@]::3} 1-3
#从下标为0的位置连续取3个值
${abc[@]:2:3} 3-5
#从下标为2的位置连续取3个值
${abc[@]:(-2):2} 6-7
#从倒数第二个下标位连续取2个值
bcd=(${abc[@]:(-2):2})
#将之前的处理结果赋值给新的数组变量
格式:${数组名[@]:下标位:数量}
元素切片:
abc=(zhangsan lisi laowang laosong)
${abc[0]}
#取第一个元素的所有字符
${abc[0]:1}
#从第一个元素的下标为1位置开始,取剩余所有字符
${abc[0]::3}
#从第一个元素的下标为0位置开始,连续取三个字符串
${abc[0]:2:3}
#从第一个元素的下标为2位置开始,连续取三个字符串
${数组名[@]:下标位:数量}:从所有的值当中取某一部分值(n个值)
${数组名[数字]:下标位:数量}:从指定的某一个值当中取一部分字符串
等同于echo ${abc[0]} | cut -c 1-5
数组替换:
abc=(one two three four)
${abc[@]/e/E}
#每一个被匹配的值,只将其中第一个符合条件的字符替换掉
${abc[@]//e/E}
#每一个被匹配的值,将其中所有符合条件的字符都替换掉
${数组名[@或*]/旧字符/新字符}
${数组名[@或*]//旧字符/新字符}
旧字符前边的/数量为1个时,只替换值当中的第一个旧字符
旧字符前边的/数量为2个时,替换值当中的所有旧字符
-----------------------------------------------------------------------
/old/new/
/old/new/g
${abc[@]/e/}
#每个被匹配元素只删除一个字符
${abc[@]//e/}
#每个被匹配元素删除多个字符
-----------------------------------------------------------
abc=(zhangsan lisi laowang laosong)
${abc[0]/#z/Z}
#将数组内第一个元素的首字符z替换成Z
${abc[0]/%n/N}
#将数组内第一个元素的尾字符n替换成N
将1个字符串拆分为多个字符串
a=`echo 2018-04-28_12:15:30_ABC.log |awk -F "." '{printf $1}'| sed -r 's/[-_:]/ /g' | tr -d "[a-zA-Z]"`
2018 04 28 12 15 30
abc=($a)
for i in ${abc[@]}
do
echo $i
done
利用数组求最大值
a=(34 78 3 95 62 59 100)
max=${a[0]}
len=${#a[@]}
for ((i=1;i<$len;i++))
do
if [[ ${a[i]} -gt ${max} ]]
then
max=${a[i]}
fi
done
echo "数组中最大值为:$max
字符串反转输出:
(a=$(seq 1 9);echo $a|rev)
# shell 99乘法表
\#!/bin/bash
for i in `seq 9`
do
for j in `seq 9`
do
[ $j -le $i ] && echo -n "${i}x${j}=$(($i*$j)) "
done
echo
done
# 正三角:
\#!/bin/bash
read -p "please input the longs:" long
for((i=1;i<=$long;i++))
do
for((j=$long;j>i;j--)) #控制空格输出
do
echo -n " "
done
for m in `seq 1 $i` #输出所在行数相同的数字个数,如在第三行,就输出3个3
do
echo -n "*"
done
\#for((n=1;n<i;n++))
for n in `seq 2 $i` #输出所在行数减一的数字个数,如在第三行,就输出2个三
do ##这连个for循环可以整合到一块,实现每行输出(2*所在行数-1)个数字
echo -n "*"
done
echo ""
done
# 菱形:
\#!/bin/bash
read -p "please input the longs:" long
for((i=1;i<=$long;i++)) #控制行数
do
for((j=$long;j>i;j--)) #控制空格输出
do
echo -n " "
done
let "g=2*i-1"
for m in `seq 1 $g` #控制*数量
do
echo -n "*"
done
echo ""
done
for((i=2;i<=$long;i++)) #控制行数
do
for ((j=1;j<i;j++)) #控制空格输出
do
echo -n " "
done
let "k=2*(long-i)+1"
for m in `seq 1 $k` #控制*数量
do
echo -n "*"
done
echo ""
done
注:本文为博主查阅多方资料整理而成,如有侵权请留言联系博主删除。
学习新东西,不要忘记复习旧知识,这样你才能更好!