61阅读

shell脚本-shell脚本中报错dirname:无效选项 -- b

发布时间:2017-12-15 所属栏目:syntax error

一 : 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版本有关。你可以用ls -l /bin/*sh打印出来,例如:-rwxr-xr-x 1 root root 959120 Mar 29 2013/bin/bashlrwxrwxrwx 1 root root 21 Nov 22 2013 /bin/csh ->/etc/alternatives/csh-rwxr-xr-x 1 root root 109768 Mar 30 2012/bin/dashlrwxrwxrwx 1 root root 4 Mar 29 2013 /bin/rbash ->bashlrwxrwxrwx 1 root root 4 Mar 30 2012 /bin/sh ->dashlrwxrwxrwx 1 root root 7 Nov 17 2012 /bin/static-sh-> busyboxlrwxrwxrwx 1 root root 13 Oct 15 2011 /bin/tcsh ->/usr/bin/tcsh在这里,sh被重定向到dash,因此,如果执行./example.sh,则使用的是dash避免报错可有多种方法,例如执行 bash example.sh,或者,将脚本第一行改为#!/bin/bash,执行./example.sh也可以。
有关该问题,还可以参考Ubuntu论坛:

三 : 我常用的主机监控Shell脚本

最近时不时有朋友问我关于服务器监控方面的问题,问常用的服务器监控除了用开源软件,比如:cacti,nagios监控外是否可以自己写shell脚本呢?根据自己的需求写出的shell脚本更能满足需求,更能细化主机监控的全面性。

下面是我常用的几个主机监控的脚本,大家可以根据自己的情况在进行修改,希望能给大家一点帮助。

1、查看主机网卡流量

  1. #!/bin/bash
  2. #!/bin/bash
  3. #network
  4. #Mike.Xu
  5. while:;do
  6. time='date+%m"-"%d""%k":"%M'
  7. day='date+%m"-"%d'
  8. rx_before='ifconfigeth0|sed-n"8"p|awk'{print$2}'|cut-c7-'
  9. tx_before='ifconfigeth0|sed-n"8"p|awk'{print$6}'|cut-c7-'
  10. sleep2
  11. rx_after='ifconfigeth0|sed-n"8"p|awk'{print$2}'|cut-c7-'
  12. tx_after='ifconfigeth0|sed-n"8"p|awk'{print$6}'|cut-c7-'
  13. rx_result=$[(rx_after-rx_before)/256]
  14. tx_result=$[(tx_after-tx_before)/256]
  15. echo"$timeNow_In_Speed:"$rx_result"kbpsNow_OUt_Speed:"$tx_result"kbps"
  16. sleep2
  17. done
  18. done

2、系统状况监控

  1. #!/bin/sh
  2. #systemstat.sh
  3. #Mike.Xu
  4. IP=192.168.1.227
  5. top-n2|grep"Cpu">>./temp/cpu.txt
  6. free-m|grep"Mem">>./temp/mem.txt
  7. df-k|grep"sda1">>./temp/drive_sda1.txt
  8. #df-k|grepsda2>>./temp/drive_sda2.txt
  9. df-k|grep"/mnt/storage_0">>./temp/mnt_storage_0.txt
  10. df-k|grep"/mnt/storage_pic">>./temp/mnt_storage_pic.txt
  11. time=`date+%m"."%d""%k":"%M`
  12. connect=`netstat-na|grep"219.238.148.30:80"|wc-l`
  13. echo"$time$connect">>./temp/connect_count.txt

3、监控主机的磁盘空间,当使用空间超过90%就通过发mail来发警告

  1. #!/bin/bash
  2. #monitoravailablediskspace
  3. SPACE='df|sed-n'//$/p'|gawk'{print$5}'|sed's/%//'
  4. if[$SPACE-ge90]
  5. then
  6. fty89@163.com
  7. fi

4、监控CPU和内存的使用情况

  1. #!/bin/bash
  2. #scripttocapturesystemstatistics
  3. OUTFILE=/home/xu/capstats.csv
  4. DATE='date+%m/%d/%Y'
  5. TIME='date+%k:%m:%s'
  6. TIMEOUT='uptime'
  7. VMOUT='vmstat12'
  8. USERS='echo$TIMEOUT|gawk'{print$4}''
  9. LOAD='echo$TIMEOUT|gawk'{print$9}'|sed"s/,//''
  10. FREE='echo$VMOUT|sed-n'/[0-9]/p'|sed-n'2p'|gawk'{print$4}''
  11. IDLE='echo$VMOUT|sed-n'/[0-9]/p'|sed-n'2p'|gawk'{print$15}''
  12. echo"$DATE,$TIME,$USERS,$LOAD,$FREE,$IDLE">>$OUTFILE

5、全方位监控主机

  1. #!/bin/bash
  2. #check_xu.sh
  3. #0****/home/check_xu.sh
  4. DAT="`date+%Y%m%d`"
  5. HOUR="`date+%H`"
  6. DIR="/home/oslog/host_${DAT}/${HOUR}"
  7. DELAY=60
  8. COUNT=60
  9. #whethertheresponsibledirectoryexist
  10. if!test-d${DIR}
  11. then
  12. /bin/mkdir-p${DIR}
  13. fi
  14. #generalcheck
  15. exportTERM=linux
  16. /usr/bin/top-b-d${DELAY}-n${COUNT}>${DIR}/top_${DAT}.log2>&1&
  17. #cpucheck
  18. /usr/bin/sar-u${DELAY}${COUNT}>${DIR}/cpu_${DAT}.log2>&1&
  19. #/usr/bin/mpstat-P0${DELAY}${COUNT}>${DIR}/cpu_0_${DAT}.log2>&1&
  20. #/usr/bin/mpstat-P1${DELAY}${COUNT}>${DIR}/cpu_1_${DAT}.log2>&1&
  21. #memorycheck
  22. /usr/bin/vmstat${DELAY}${COUNT}>${DIR}/vmstat_${DAT}.log2>&1&
  23. #I/Ocheck
  24. /usr/bin/iostat${DELAY}${COUNT}>${DIR}/iostat_${DAT}.log2>&1&
  25. #networkcheck
  26. /usr/bin/sar-nDEV${DELAY}${COUNT}>${DIR}/net_${DAT}.log2>&1&
  27. #/usr/bin/sar-nEDEV${DELAY}${COUNT}>${DIR}/net_edev_${DAT}.log2>&1&

放在crontab里每小时自动执行:

  1. 0****/home/check_xu.sh

这样会在/home/oslog/host_yyyymmdd/hh目录下生成各小时cpu、内存、网络,IO的统计数据

如果某个时间段产生问题了,就可以去看对应的日志信息,看看当时的主机性能如何。

原文链接:http://blog.jobbole.com/46942/

本文标题:shell脚本-shell脚本中报错dirname:无效选项 -- b
本文地址: http://www.61k.com/1161100.html

61阅读| 精彩专题| 最新文章| 热门文章| 苏ICP备13036349号-1