1.shell脚本的创建执行
1 2 #!/bin/bash echo "www.google.com"
执行 :/opt/shell/wordcount.sh
给该脚本的用户以及用户组加上执行权限
chmod 654 xxx.sh
shell 命令的debug
在#!/bin/bash 后面加上-x的参数可以在控制台中打印出执行的命令以及执行命令的结果
sh -x wordcount.sh 可以使用这个命令来进行调试
生产上面开发shell脚本
1.开头需要定义#!/bin/bash
2.调试脚本 #!/bin/bash -x
注意:使用sh执行脚本的时候 sh xxx.sh 不论在脚本的第一行是否加上#!/bin/bash 都可以执行该脚本
2.定义变量及引用
vim variable.sh
1 2 3 4 5 6 7 #!/bin/bash aa="www.google.com" date=`date` echo $aa echo $date
静态变量:值不会变化 k=“v” -->字符串 k=v -->数值
动态变量:值会发生改变 k=`v`
等号前后不能有空格
变量的引用:$a ${aa} :变量的引用需要加上美元符号
生产上面建议引用变量的时候加上大括号{}
3.传递参数
向shell脚本中传递参数
$1
$2
vim param.sh
1 2 3 4 5 6 7 #!/bin/bash echo $1 echo $2 echo "参数个数:$# " echo "传递参数作为一个字符串显示:$*" echo "PID:$$"
参数释义 :
1 2 3 4 5 $1 :传递进来的第一个参数 $2 :传递进来的第二个参数 $# :传递进来的参数的个数 $* :传递进来的全部参数作为一个参数 $$ :显示PID
4.数组
一维数组
vim array.sh
1 2 3 4 5 6 7 8 9 10 11 #!/bin/bash arr=(math chinese english) echo ${arr} echo ${arr[*]} echo ${arr[0]} echo ${#arr[*]} echo ${arr[@]} echo ${#arr[@]}
参数释义 :
1 2 3 4 5 ${arr} :数组中的第一个元素 ${arr[*]} :取数组中的所有元素 ${arr[0]} :取数组中的第一个元素 ${#arr[*]}:取数组中元素的个数 上面的* 也可用@ 来表示
5.if 判断
vi if.sh
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 #!/bin/bash a="abc" b="jepson" if [ $a == $b ];then if 里面的中括号前后要打上空格 echo "==" else echo "!=" fi if [ $a == $b ];then 表示的是写到同一行中if [ "$a " == "$b " ];then echo "==" elif [ "$a " == "ccc" ];then echo "ccc" else echo "!=" fi
6.循环
for循环 while循环
vim for.sh
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 #!/bin/bash echo "=========for循环==============" for x in 1 2 3 4 5do echo $x done echo "==========for循环=============" for ((int i=1;i<10;i++))do echo $i done echo "===========while循环============" j=1 while (($j <10))do echo ${j} let "j++" done
7.分割字符串
vi split.sh
1 2 3 4 5 6 7 8 9 10 11 12 #!bin/bash s="math,english,chinese,scala,spark,hdfs,hadoop" OLD_IFS= "$IFS " IFS="," arr=($s ) IFS="$OLD_IFS " for x in ${arr[*]} do echo $x done
第二种:
vim splits.sh
1 2 3 4 5 6 7 #!/bin/bash s="math,english,chinese,scala,spark,hdfs,hadoop" arr2=(${s//,/ } ) for x in ${arr2[*]} do echo $x done
8.案例:监控脚本
vi ganglia.sh
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 #!/bin/bash for ip in $(cat /opt/monitor/sh/ping/ip_list|sed "/^#d" )do ping -c 1 $ip &>/dev/null a=$? sleep 2 ping -c 1 $ip &>/dev/null a=$? sleep 2 ping -c 1 $ip &>/dev/null a=$? sleep 2 DATE=$(date +%F" " %H:%M) if [ $a -ne 0 -a $b -ne 0 -a $c -ne 0 ];then python /opt/monitor/sh/weixin_alert.py "Critical: ${ip} can't ping" else echo "$ip ping is successful." fi done
ssh
1 2 3 4 for ip in $(cat /opt/monitor/sh/ping/ip_list|sed "/^#d" )do ssh -o ConnectTimeout=5 $ip date &>/dev/null done
9.判断数组是否为空
1 2 3 4 5 6 7 #!/bin/bash para1=() if [ ! -n "$para1 " ];then echo "param is null" else echo "param is not null" fi
10.判断数组是否包含字符串-数字
方法一 :推荐
1 2 3 4 5 6 7 8 9 10 #!/bin/bash array=(hadoop,hive,spark,kafka,hbase,flink) var=hadoops if [ ${array[@]/${var} /} != ${array[@]} ];then echo "hadoop is in array" else echo "hadoop is not in array" fi
11.判断文件夹-文件-变量是否存在参数
1 2 3 4 -d:判断文件夹是否存在 -f:判断文件是否存在 -x:判断是否存在并且是否具有可执行权限 -n:判断一个变量是否有值
代码如下 :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 #!/bin/bash flod=/root/shell/fload file=/root/shell/fload/file.txt echo "==========判断文件夹==========" if [ -d ${flod} ];then echo "${flod} is in the path" else echo "not in the path" fi echo "==========判断文件==========" if [ -x ${file} ];then echo "file is exisit" else echo "file is not exisit" fi echo "==========判断变量==========" if [ ! -n ${param} ];then echo "param is not null" else echo "param is null" fi
12.判断文件是否为空
参数释义 :
1 2 3 4 5 -e:文件存在 -s:文件长度不为0 -r:文件具有读权限 -w:文件具有写权限 -x:文件具有执行权限
代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 #!/bin/bash file=/root/shell/fload/sutdent.txt flod=/root/shell/fload echo "==========判断文件是否存在==========" if [ -e ${file} ];then echo "file is exisit" else echo "file is not exisit" fi echo "==========判断文件是否为空==========" if [ ! -s ${file} ];then echo "file is null" else echo "file is xxx kb" fi echo "==========判断文件是否具有执行权限==========" if [ -x ${file} ];then echo "file have the execute permission" else echo "file not have the execute permission" fi
持续更新