shell——array、函数、内置命令

变量
普通数组(索引是整数)
books=(aaa bbb)
关联数组(索引可以是字符串)(需用declare -A 数组名 来定义关联数组,否则会被视为普通数组)

declare -A info
info=([name]=aaaa [age]=bbbb)
echo ${info[name]}

echo ${数组名[@]} 访问所有数组元素 等同于echo ${数组名[*]}
echo ${数组名[#@]} 访问所有数组元素个数
echo ${!数组名[@]} 访问所有数组元素的索引

echo ${数组名[@]:1} 访问从数组下标1开始的后面所有元素(仅普通数组,关联数组不行)
echo ${数组名[@]:1:2} 访问从数组下标1开始的后面两个元素(仅普通数组,关联数组不行)

遍历和赋值

vim array_while.sh

#!/usr/bin/bash
while read line
do
	hosts[++i]=$line
done </etc/hosts 这里应该是数组定义的位置

echo "hosts first: ${hosts[1]}"
echo

for i in ${!hosts[@]}
do
	echo "$i: ${hosts[i]}"
done

vim vim array_for.sh

#!/usr/bin/bash
OLD_IFS=$IFS 通过这个东西把分隔符为回车设置作用域
IFS=$'\n'

for line in `cat /etc/hosts`
do
	hosts[++j]=$line
done
for i in ${!hosts[@]}
do
	echo "$i: ${hosts[i]}"
done

IFS=$OLD_IFS

以上其实用awk一行就搞定了。。

awk -F":" '{print $NF}'  其中-F的作用是定义分割点,这里是定以:分割。NF最后一列

统计TCP连接状态数量

#!/usr/bin/bash
declare -A status
type=`ss -an |grep :80 |awk '{print $2}'`

for i in $type
do
	let status[$type]++
done

for j in ${!status[@]}
do
	echo "$j: ${status[$j]}"
done

使用watch -n2 ./shell文件.sh查看脚本实时变化 -n2表示每2秒刷新一次,或者也可以自己用循环实现

函数

传参 $1 $2(函数内的,是与函数外的$1区分开的)
变量 local 作用域仅在函数内
返回值 return $?

#!/usr/bin/env bash自动寻找bash位置

算阶乘

#!/bin/bash
factorial(){
factorial=1
for((i=1;i<=10;i++))
do
	factorial=$[$factorial * $i]
done
echo "sum: $factorial"
factorial

带参数

#!/bin/bash
factorial(){
factorial=1
for((i=1;i<=$1;i++))
do
	factorial=$[$factorial * $i]
done
echo "$1: $factorial"
factorial 10 参数10从这加

函数的返回值默认是函数内部最后一条命令的返回值或者手动定义return。
注意shell的返回码最高只能是255(其实可以,但是不能这么直接返回)

fun2()
return $[2*2]

fun2
echo "$?"

如何让返回值可以是任意的
这里不是用return,而是用echo+变量,如下

fun(){
read num
echo $[2*$num]
}

result=`fun` 也就是将fun内打印的结果传给变量就行了
echo "$result"

函数的数组参数传递

#!/usr/bin/bash
num=(1 2 3 4 5)

array(){
	local f=1  加了loacl表示仅函数内部有效
	for i in "$@" 这里 就是遍历了所有参数
	do
		f=$i
	done
	echo "$f"
}
array ${num[@]}

没有in的for

#!/usr/bin/bash
for i  不写in相当于遍历所有参数 相当于in "$@"
do
	let sum=$sum+$i
done
echo $sum

shell内置命令

: 冒号类似于python的pass
true
false
exit
breakbreak 2 跳出两层循环break 1或break跳出1层循环
continue continue 2跳过本次和下一次循环continue 3同理
shift 位置变量,将位置变量全部左移一位即 $1的值被$2的值覆盖 $3的值被$4覆盖依次下去。shift x将位置变量全部左移x位
vim shift.sh

while [ $# -ne 0 ]
do
	let sum+=$1
	shift
done
echo "sum: $sum"

./shift.sh 2 3 4
运行结果为9

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值