shell 编程
变量分类
1.本地变量:用户私有变量,只有本用户可以使用,保存再家目录下.bash_profile、.bashrc文件中
2.全局变量:所有用户都可以使用,保存再/etc/profile、/etc/bashrc文件中
3.用户自定义变量:用户自定义,比如脚本中的变量
变量一般使用全大写,以和命令进行区分
NAME="My"
echo $NAME $是读取变量值
终端变量在终端关闭后将会消失,脚本变量关闭后,消失
定义变量
在 shel 编程中,变量赋值 = 号不能有空格。
不能使用关键字
其他与 C#差不多吧
如: NAME="My"
字符串需要使用双引号
unset NAME 取消变量
source ~/.bash_profile
家目录环境变量生效
全局变量
vim /etc/profile
export NAME="xxx" # 也可用与终端
export 表示导出为全局变量
读取变量内容
使用取内容符号 ( )NAME
数组
基本数组
#!/bin/bash
# 定义数组,空格隔开
ARRAY1=(1 2 3 4 5)
echo ${ARRAY1[1]}
# 将/etc/passwd 中每一行赋值到数组ARRAY2
ARRAY2=(`cat /etc/passwd`)
查看数组
declare -a # 查看已经生命过的数组
访问数组元素
echo ${array1[0]} # 访问数组中的第一个元素
echo ${array[@]} # 访问数组中所有的元素
echo ${#array1[@]} # 获取数组的长度
echo ${!array2[@]} # 获取数组元素索引
echo ${array1[@]:1} # 从数组下标1开始
echo ${array1[@]:1:2} # 从数组下标1开始,访问两个元素
关联数组-类似 Dictionary_csharp
# 关联数组
declare -A ass_array1
ass_array1=([name]="xxxx" [age]=18)
echo ${ass_array1[@]}
echo ${ass_array1[name]}
流程控制
逻辑运算符
数学比较运算符
-eq 等于 equal
-gt 大于 greater than
-lt 小于 less than
-ge 大于等于 greater equal
-le 小于等于 less equal
-ne 不等于 not equal
test 检测文件类型或者比较运算
test 1 -eq 1 ;echo $?;
cut -d '.' -f1 以.切分
echo "1.5*10"|bc|cut -d '.' -f1 #-f1为第一段
bash -x debug模式
文件比较检查
# 判断文件夹是否存在。
test -d /mnt/d/test;echo $?;
# 判断文件或者目录是否存在
test -e /mnt/d/test/first.sh
-f #检测是否为文件且为文件
-r 检测文件是否存在且可读
-s 检测文件是否存在且不为空
-w 检测文件是否存在且可写
-x 检测文件是否存在且可读
-o 检测文件是否存在且被当前用户拥有
-G 检测文件是否存在且默认组为当前文件
file1 -nt file2 检测file1是否比file2新
file1 -ot file 检查file1是否比file2旧
字符串比较运算
== 等于
!= 不等于
-n 检测字符串的长度是否大于0
-z 检测字符串的长度是否为0
逻辑运算符
== != -n -z
if
if [ condition ]; then
# body
elif [ condition ]; then
# body
else
# body
fi
if [];then
fi
if 高级
if ((100%3+1>1));then
echo "yes";
else
echo "no";
fi
#if [[$i == r*]] 判断$i变量值是否以r开头 [[]] 双中括号可以匹配字符串
if [[ $USER == y* ]];then
echo "11111"
fi
for 循环
for ((i=0;i<100;i++)); do
echo "$i"
done
for col in `docker images | awk '{ print $1":"$2 }'`; do
echo "$col" | cut -d ':' -f 1
echo "$col" | cut -d ':' -f 2
done
# 获得当前时间
date +"%F %H:%M:%S"
# for 依然支持continue break等。
while
#!/bin/bash
function PingIP () {
while [ $? -eq 0 ]; do
ping -c1 192.168.10.100 &>/dev/null
if [ $? -eq 0 ];then
echo "`date +"%F %H:%M:%S"`: $1 is UP"
else
echo "`date +"%F %H:%M:%S"`: $1 is Down";
fi
sleep 1s
done
}
PingIP "192.168.10.100"
until 条件为假执行
until [ condition ]; do
# body
done
case 相当于switch
case "$item" in
1)
echo "case 1"
;;
2|3)
echo "case 2 or 3"
;;
*)
echo "default"
;;
esac
shell 特殊变量
特殊参数
$* 表示所有参数,其间隔为IFS内定参数的第一个字元
$@ 与*号相同。不同之处在于不参照IFS
$# 代表参数数量
$ 执行上一个指令的返回值
$- 最近执行的foreground pipeline的选项参数
$$ 本身的Process ID
$: 执行上一个背景指令的PID
$_ 显示出最后一个执行的命令
$N N是shell的第几个外传参数,比如N1是第一个参数
方法
注意:shell 的 function 是没有参数的,使用$1 表示第一个参数,$2 表示第二个参数,在调用这个 function 时, PingIP 第一个参数 第二个参数
action "nginx start" $nginxd
killall 关闭线程 QUIT/HUB
lsof 命令 lsof是系统管理/安全的管理工具。
正则表达式
grep、awk、sed 都支持正则表达式