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
posted @ 2020-04-15 19:57  候你已久  阅读(105)  评论(0)    收藏  举报