1.shell脚本的创建执行

创建wordcount.sh

#!/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

#!/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

#!/bin/bash

echo $1
echo $2
echo "参数个数:$#"
echo "传递参数作为一个字符串显示:$*"
echo "PID:$$"

$1 :传递进来的第一个参数$2 :传递进来的第二个参数$# :传递进来的参数的个数$* :传递进来的全部参数作为一个参数$$ :显示PID

4.数组

一维数组

vim array.sh

#!/bin/bash

arr=(math chinese english)
echo ${arr}      #只打印第一个
echo ${arr[*]}   #打印数组中的所有的值
echo ${arr[0]}   #打印第一个值 
echo ${#arr[*]}  #打印数组的个数


echo ${arr[@]}   #打印数组中的所有的值
echo ${#arr[@]}  #打印数组的个数

${arr} :数组中的第一个元素${arr[*]} :取数组中的所有元素${arr[0]} :取数组中的第一个元素${#arr[*]}:取数组中元素的个数上面的* 也可用@ 来表示

5.if判断

vi if.sh

#!/bin/bash

a="abc"
b="jepson"

if  [  $a == $b ];then  if里面的中括号前后要打上空格
	echo "=="
	
else 
	echo "!="
fi 


if [  $a == $b ];then 表示的是写到同一行中

if [ "$a" == "$b"] 这种的写法也是可以的

多个if else的使用

if[ "$a" == "$b" ];then 
	echo "=="
elif[ "$a" == "ccc" ];then
	echo "ccc"
else
	echo "!="
fi
6.循环

for循环 while循环

vim for.sh

#!/bin/bash
echo "=========for循环=============="
for x in 1 2 3 4 5
do
	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

#!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

#!/bin/bash
s="math,english,chinese,scala,spark,hdfs,hadoop"
arr2=(${s//,/ })
for x in ${arr2[*]}
do
	echo $x
done
8.案例:监控脚本

vi ganglia.sh

#!/bin/bash
for ip in $(cat /opt/monitor/sh/ping/ip_list|sed "/^#d")
do
	ping -c 1 $ip &>/dev/null # 三个ping 有一个能通,说明服务器正常
	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
	#weixin alert
	python /opt/monitor/sh/weixin_alert.py "Critical: ${ip} can't ping"
	else
		echo "$ip ping is successful."
	fi
done

ssh

for ip in $(cat /opt/monitor/sh/ping/ip_list|sed "/^#d")
do
	ssh -o ConnectTimeout=5 $ip date &>/dev/null # 能够正常返回时间说明是正常的
done
shell 判断数组是否为空
#!/bin/bash
para1=()
if [ ! -n "$para1" ];then
  echo "param is null"
else 
  echo "param is not null"
fi
shell 判断数组是否包含某一字符串或数字

方法一:推荐

#!/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

shell 判断文件夹、文件、变量是否存在参数

-d:判断文件夹是否存在-f:判断文件是否存在-x:判断是否存在并且是否具有可执行权限-n:判断一个变量是否有值

#!/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

shell 判断文件是否为空

-e:文件存在-s:文件长度不为0-r:文件具有读权限-w:文件具有写权限-x:文件具有执行权限

#!/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