变量
普通数组(索引是整数)
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