shell知识

脚本的执行方法:5种
绝对路径:#/home/shell/shell.sh
相对路径:#../shell.sh
$PATH中:#shell.sh
bash命令:#bash shell.sh
source命令(简写"."):#. shell.sh
脚本的书写:
第一行:#!/bin/bash   #!叫shabang header
文件头:
    脚本名、作者、联系方式、日期、changelog
定义变量:
    PATH、LANG、自定义变量
定义函数:
主程序:
    返回值
返回值:
代表程序(指令、语句)的执行情况。
父进程负责收集子进程的返回值。
0    成功
非0  失败
    2   用法错误
    126 没权限
    127 命令没找到
定义方法:
exit N
return N
查看方法:只能常上一个程序。
#echo $?
变量:
保存数据的一种形式,在内存中分配的位置。
变量名:
字母或下划线开头,后面更随字母数字或下划线。
#echo $PATH
 显示   变量名
变量的定义(赋值):
变量名=值     =两边不能空格、不要用$
#A=123
#echo $A
#unset A   退出终端也行
#A=/etc/*.conf
#echo $A
间接引用:
#A=B
#B=helloworld
#echo ${!A}   #eval echo \$$A
全局变量:
#A=helloword
#export A
#export
#bash
#echo $A
helloword
#exit
#export -n A
#export | head -n 5
想永久生效的话,写配置文件/etc/[bashrc|profile]。
内部变量:
PPID  父进程的PID
UID   当前用户UID
EUID  有效用户UID
BASH  bash二进制文件的路径
BASH_VERSION  bash版本信息
SHELL  登录shell的绝对路径
SHELLOPTS  当前shell启用的选项
EDITOR  默认编辑器
USER/LOGNAME   用户名/登录名
HOME  用户主目录
PWD   当前目录
HOSTNAME  主机名
MACHTYPE/OSTYPE  机器类型/系统类型
PATH  可执行文件的搜索路径
#PATH=$PATH:/root/bin
#export PATH
REPLY    输入数据的默认存储变量
SECONDS  脚本运行时间
RANDOM   随机数0-32767   #echo $(($RANDOM%100))  1-100之间的随机数
PS1  第一提示符
PS2  第二提示符
$?  上一个命令的返回值
$$  当前进程的PID
$!  最近一个后台进程的PID
$0  脚本名字
$1...$N  脚本的第1个参数
$#  参数的个数
$@  所有参数,一个一个的。"A" "B"
"$@"  所有参数,一个一个的。
$*  所有参数,一个一个的。
"$*"  所有参数,一个字符串。"A B"
#!bin/bash
echo "input something..."
read
echo $REPLY
echo '$0='$0
echo '$1='$1
echo '$10='${10}    位置变量大于10、数组、间接引用
echo '$#='$#
echo '$@='$A
done
for B in "$@" ; do
  echo '" $@"='$B
done
for C in $* ; do
  echo '$*='$C
done
for D in "$*" ; do
  echo '"$*"='$D
done
for i in ${array[@]} ; do
  echo $i
done
例:
9*9.sh
#!/bin/bash
for i in {1..9} ; do
  for n in `seq 1 $i` ; do
    echo -ne "$i*$n=$(($i*$n))"
  done
  echo
done
ping.sh
方法一:
#!/bin/bash
for i in {252..254} ; do
  ping -c1 192.168.18.$i &> /dev/null
  if [ "$?" == "0" ] ; then
    echo "192.168.18.$i online."
  else
    echo "192.168.18.$i offline."
  fi
done
方法二:
for i in {252..254} ; do
  if ping -c1 192.168.18.$i &> /dev/null ; then
    echo "192.168.18.$i online."
  else
    echo "192.168.18.$i offline."
  fi
done
方法三:
for i in {252..254} ; do
  result=`ping -c1 192.168.18.$i | grep ttl | cut -d "=" -f 2 | cut -d " " -f 2`
  if [ "$result" == "ttl" ] ; then
    echo "192.168.18.$i online."
  else
    echo "192.168.18.$i offline."
  fi
done
mssh.sh
#!/bin/bash
#mssh.sh "IP1 IP2"  "service iptables stop"
for i in $1 ; do
  ssh $i $2
done
监控磁盘
#!/bin/bash
for space in `LANG=C df -h | grep -v Use | awk '{print $5}' | cut -d "%" -f 1`
do
  if [ $space -get 80 ] ; then
    echo "Over 80%" | mail -s "report" root@localhost
  else
    echo "Disk space normail" | mail -s "report" root@localhost
  fi
done
while:#true #false
while CONTROL-COMMAND
do
  CONSEQUENT-COMMANDS
done
例:
#!/bin/bash
i=0
while [ $i -lt 4 ] ; do
  echo $i
  i=$[$i+1]
done
until:
until CONTROL-COMMAND
do
  CONSEQUENT-COMMANDS
done
例:
#!/bin/bash
num=1
until [ ! "$num" -le 5 ] ; then
do
  echo "$num"
  num=$(($num+1))
done
练:
监控httpd是否运行,没运行的话尝试重启并发邮件报警。
#!/bin/bash
process=httpd
while true ; do
  #result=`pstree | grep $process`
  pstree | grep $process &> /dev/null
  if [ $? -eq 0 ] ; then
    echo "$process is running." | mail -s "report" root@localhost
  else
    echo "$process NOT running." | mail -s "report" root@localhost
  fi
  sleep 600
done
case

break continue
shift

函数
autoinstall.sh
 

你可能感兴趣的:(shell,职场,休闲)