一 : shell脚本中报错dirname:无效选项 -- b
今天在写一个Shell脚本的时候,发现调试的时候会报一个错
[Oracle@smidb11 autoawrrpt]$ . a.sh dirname:无效选项 -- b请尝试执行"dirname --help"来获取更多信息。basename:无效选项 -- b请尝试执行"basename --help"来获取更多信息。
脚本内容如下:
[oracle@smidb11 autoawrrpt]$ cat a.sh#!/bin/bash#################################################################################自动生成最新的AWR报表#版本:v1.0#变量说明:#LOGFILE:保存日志文件名####################################修改历史#####################################################################################################################WORKDIR=$(dirname $0) #获取到脚本所在目录cd ${WORKDIR} #改变当前目录为脚本所在目录WORKDIR=`pwd` #获取当前目录的具体路径SCRIPTNAME=$(basename $0) #获取脚本名称FPATH="${WORKDIR}${SCRIPTNAME}" #脚本全路径LOGFILE="${WORKDIR}/${SCRIPTNAME}.log" #设置日志文件名称AWR_TYPE="html" #设置AWR的类型,值应该为html或者txtAWR_HOME="${WORKDIR}/awr_report" #设置存放AWR报表的目录AWR_DAYS=1 #设置AWR Snap检索的天数HOSTNAME=`hostname` #主机名mkdir -p ${AWR_HOME} #如果没有此目录,则创建 -p选项代表无则创建,有则直接返回
报错的是在 WORKDIR=$(dirname $0) 这一行内容,这让我感觉很奇怪,第一,我没有在这个命令后面添加-b选项啊,为什么会报错错误的选项 -b 呢?
然后在这行下面增加 echo $0 输出,看看$0的内容到底是什么
[oracle@smidb11 autoawrrpt]$ . a.shdirname:无效选项 -- b请尝试执行"dirname --help"来获取更多信息。-bashbasename:无效选项 -- b请尝试执行"basename --help"来获取更多信息。
这就奇怪了,$0 不是应该返回脚本的当前路径吗? 怎么会变成 -base 了呢?
我们接着试验:
[oracle@smidb11 autoawrrpt]$ ./a.sh ./a.sh
直接运行,输出结果变成正确的啦,$0输出执行脚本的相对路径.
为什么会导致这样的问题呢?为了证明这个问题,我们直接在shell里面运行 echo $0
[mysql@test ~]$ echo $0-bash
然后我们回顾一下,Linux下面的点命令
使用 点命令执行脚本的时候,直接在当前的shell中执行脚本,而不会打开一个新的Shell执行脚本
看到这里我们就不难理解了。因为 . 命令不会打开新的Shell执行脚本,所以echo $0的时候,$0的值还是我们原来的shell的$0, 也就是 -bash 了, 而 basename命令就会把 -bash当成一个参数来执行,所以才会报错,错误的选项 -b。
。www.61k.com)知道原因了,我们的问题也就很好解决了,直接运行,不要通过 点命令 或者 source 命令运行脚本即可。
本文永久更新链接地址:
二 : shell脚本数组报错Syntaxerror:"("unexpected
按照正常的shell数组定义,例如example.sh#!/bin/sha=( 1 2 3)for number in ${a[@]}doecho $numberdone执行该脚本,在有的机器上会报错Syntax error: "(" unexpected三 : 我常用的主机监控Shell脚本
最近时不时有朋友问我关于服务器监控方面的问题,问常用的服务器监控除了用开源软件,比如:cacti,nagios监控外是否可以自己写shell脚本呢?根据自己的需求写出的shell脚本更能满足需求,更能细化主机监控的全面性。
下面是我常用的几个主机监控的脚本,大家可以根据自己的情况在进行修改,希望能给大家一点帮助。
1、查看主机网卡流量
- #!/bin/bash
- #!/bin/bash
- #network
- #Mike.Xu
- while:;do
- time='date+%m"-"%d""%k":"%M'
- day='date+%m"-"%d'
- rx_before='ifconfigeth0|sed-n"8"p|awk'{print$2}'|cut-c7-'
- tx_before='ifconfigeth0|sed-n"8"p|awk'{print$6}'|cut-c7-'
- sleep2
- rx_after='ifconfigeth0|sed-n"8"p|awk'{print$2}'|cut-c7-'
- tx_after='ifconfigeth0|sed-n"8"p|awk'{print$6}'|cut-c7-'
- rx_result=$[(rx_after-rx_before)/256]
- tx_result=$[(tx_after-tx_before)/256]
- echo"$timeNow_In_Speed:"$rx_result"kbpsNow_OUt_Speed:"$tx_result"kbps"
- sleep2
- done
- done
2、系统状况监控
- #!/bin/sh
- #systemstat.sh
- #Mike.Xu
- IP=192.168.1.227
- top-n2|grep"Cpu">>./temp/cpu.txt
- free-m|grep"Mem">>./temp/mem.txt
- df-k|grep"sda1">>./temp/drive_sda1.txt
- #df-k|grepsda2>>./temp/drive_sda2.txt
- df-k|grep"/mnt/storage_0">>./temp/mnt_storage_0.txt
- df-k|grep"/mnt/storage_pic">>./temp/mnt_storage_pic.txt
- time=`date+%m"."%d""%k":"%M`
- connect=`netstat-na|grep"219.238.148.30:80"|wc-l`
- echo"$time$connect">>./temp/connect_count.txt
3、监控主机的磁盘空间,当使用空间超过90%就通过发mail来发警告
- #!/bin/bash
- #monitoravailablediskspace
- SPACE='df|sed-n'//$/p'|gawk'{print$5}'|sed's/%//'
- if[$SPACE-ge90]
- then
- fty89@163.com
- fi
4、监控CPU和内存的使用情况
- #!/bin/bash
- #scripttocapturesystemstatistics
- OUTFILE=/home/xu/capstats.csv
- DATE='date+%m/%d/%Y'
- TIME='date+%k:%m:%s'
- TIMEOUT='uptime'
- VMOUT='vmstat12'
- USERS='echo$TIMEOUT|gawk'{print$4}''
- LOAD='echo$TIMEOUT|gawk'{print$9}'|sed"s/,//''
- FREE='echo$VMOUT|sed-n'/[0-9]/p'|sed-n'2p'|gawk'{print$4}''
- IDLE='echo$VMOUT|sed-n'/[0-9]/p'|sed-n'2p'|gawk'{print$15}''
- echo"$DATE,$TIME,$USERS,$LOAD,$FREE,$IDLE">>$OUTFILE
5、全方位监控主机
- #!/bin/bash
- #check_xu.sh
- #0****/home/check_xu.sh
- DAT="`date+%Y%m%d`"
- HOUR="`date+%H`"
- DIR="/home/oslog/host_${DAT}/${HOUR}"
- DELAY=60
- COUNT=60
- #whethertheresponsibledirectoryexist
- if!test-d${DIR}
- then
- /bin/mkdir-p${DIR}
- fi
- #generalcheck
- exportTERM=linux
- /usr/bin/top-b-d${DELAY}-n${COUNT}>${DIR}/top_${DAT}.log2>&1&
- #cpucheck
- /usr/bin/sar-u${DELAY}${COUNT}>${DIR}/cpu_${DAT}.log2>&1&
- #/usr/bin/mpstat-P0${DELAY}${COUNT}>${DIR}/cpu_0_${DAT}.log2>&1&
- #/usr/bin/mpstat-P1${DELAY}${COUNT}>${DIR}/cpu_1_${DAT}.log2>&1&
- #memorycheck
- /usr/bin/vmstat${DELAY}${COUNT}>${DIR}/vmstat_${DAT}.log2>&1&
- #I/Ocheck
- /usr/bin/iostat${DELAY}${COUNT}>${DIR}/iostat_${DAT}.log2>&1&
- #networkcheck
- /usr/bin/sar-nDEV${DELAY}${COUNT}>${DIR}/net_${DAT}.log2>&1&
- #/usr/bin/sar-nEDEV${DELAY}${COUNT}>${DIR}/net_edev_${DAT}.log2>&1&
放在crontab里每小时自动执行:
- 0****/home/check_xu.sh
这样会在/home/oslog/host_yyyymmdd/hh目录下生成各小时cpu、内存、网络,IO的统计数据
如果某个时间段产生问题了,就可以去看对应的日志信息,看看当时的主机性能如何。
原文链接:http://blog.jobbole.com/46942/
本文标题:shell脚本-shell脚本中报错dirname:无效选项 -- b61阅读| 精彩专题| 最新文章| 热门文章| 苏ICP备13036349号-1