糖尿病康复,内容丰富有趣,生活中的好帮手!
糖尿病康复 > 【Linux】shell编程5(Shell脚本常见错误示例 Shell脚本调试技巧 shell脚本开发环境

【Linux】shell编程5(Shell脚本常见错误示例 Shell脚本调试技巧 shell脚本开发环境

时间:2022-02-18 01:39:25

相关推荐

【Linux】shell编程5(Shell脚本常见错误示例 Shell脚本调试技巧 shell脚本开发环境

一、Shell脚本调试

1、Shell脚本常见错误示例

1.1 if条件语句缺少结尾关键字

1 #!/bin/bash2 if [ 1 -lt 2 ];then3 echo "Yes"4[root@node1 ~]# sh test.sh =====>执行之后报错如下test.sh: line 4: syntax error: unexpected end of file#第四行报语法错误,这不是所期待的文件结尾,发现缺少了fi

1.2 循环语句缺少关键字

1 #!/bin/bash2 if [ 1 -lt 2 ];the <=========== 这里缺少一个n,应该为then3 echo "Yes"4 fi[root@node1 ~]# sh test.shtest.sh: line 4: syntax error near unexpected token `fi'test.sh: line 4: `fi'#报错第四行附近有错误

1.3 成对的符号落单

成对的符号有[],(),{},"",'',``,如果落单了,也会导致一些错误

1 #!/bin/bash2 a="1233 b="456"4 c="a+b"5 echo $c[root@node1 ~]# sh test.shtest.sh: line 4: unexpected EOF while looking for matching `"' <======提示缺少了"号test.sh: line 6: syntax error: unexpected end of file报错是在4和6 最后发现是第二行缺少了",因为在第四行有调用第二行数据

1.4 方括号两端没空格

1 #!/bin/bash2 if [1 -lt2 ];then3 echo "YES"4 fi[root@node1 ~]# sh test.shtest.sh: line 2: [1: command not found <======提示第二行[1有问题

2、Shell脚本调试技巧

2.1使用echo命令调试

#!/bin/bash#create by nebula#date:0525#dec:int compareread -p "please input teo num: " a becho $a $b # 增加打印输出,确认变量值是否符合要求。#exit #退出脚本#if [ $a -lt $b ]if (($a < $b))thenecho "$a < $b"elif [ $a -eq $b ]thenecho "$a=$b"elseecho "$a>$b"fi[root@nebulalinux03 ~]# . debug.shplease input teo num: 99 10099 10099 < 100

2.2 使用bash命令参数调试

[root@nebulalinux03 ~]# bash [-nvx] script.sh#-n:不会执行该脚本,仅查询脚本语法是否有问题,并给出错误提示#-v:执行脚本时,先将脚本的内容输出到屏幕上,然后执行脚本,如果有错误,会给出错误提示#-x:将执行的脚本的内容及输出显示到屏幕上,

二、shell脚本开发环境配置和优化

1、优化vim编辑配置

在这里我只给当前用户vim优化了配置;

配置完成后要保存退出,然后之前reboot命令重新加载;

vi /root/.vimrc" ~/.vimrc" vim config file" date -08-29" Created by xiaoxing""""""""""""""""""""""" => 全局配置""""""""""""""""""""""关闭兼容模式set nocompatible"设置历史记录步数set history=1000"开启相关插件filetype onfiletype plugin onfiletype indent on"当文件在外部被修改时,自动更新该文件set autoread"激活鼠标的使用"set mouse=a"""""""""""""""""""""" => 字体和颜色""""""""""""""""""""""开启语法syntax enable"设置字体set guifont=dejaVu\ Sans\ MONO\ 10""设置配色colorscheme desert"高亮显示当前行set cursorlinehi cursorline guibg=#00ff00hi CursorColumn guibg=#00ff00"""""""""""""""""""""" => 文字处理 by Nebula xiaoxing""""""""""""""""""""""使用空格来替换Tabset expandtab"设置所有的Tab和缩进为4个空格set tabstop=4"设定 << 和 >> 命令移动时的宽度为4set shiftwidth=4"使得按退格键时可以一次删掉4个空格set softtabstop=4set smarttab"缩进,自动缩进(继承前一行的缩进)"set autoindent命令关闭自动缩进,是下面配置的缩写。"可使用autoindent命令的简写,即 “:set ai” 和 “:set noai”。"还可以使用“ :set ai sw=4”在一个命令中打开缩进并设置缩进级别。set ai"智能缩进set si"自动换行set wrap"设置软宽度set sw=4"""""""""""""""""""""" => Vim 界面 by Nebula xiaoxing""""""""""""""""""""""Turn on WiLd menuset wildmenu"显示标尺set ruler"设置命令行的高度set cmdheight=1"显示行数set nu"Do not redraw, when running macros.. lazyredrawset lz"设置退格set backspace=eol,start,indent"Bbackspace and cursor keys wrap toset whichwrap+=<,>,h,l"Set magic on(设置魔术)set magic"关闭遇到错误时的声音提示"关闭错误信息响铃set noerrorbells"关闭使用可视响铃代替呼叫set novisualbell"显示匹配的括号([{和}])set showmatch"How many tenths of a second to blinkset mat=2"搜索时高亮显示搜索到的内容set hlsearch"搜索时不区分大小写"还可以使用简写(“:set ic” 和 “:set noic”)set ignorecase"""""""""""""""""""""" => 编码设置""""""""""""""""""""""设置编码set encoding=utf-8"设置文件编码set fileencodings=utf-8"设置终端编码set termencoding=utf-8"""""""""""""""""""""" => 其他设置 by Nebula xiaoxing """"""""""""""""""""""开启新行时使用智能自动缩进set smartindentset cinset showmatch"隐藏工具栏set guioptions-=T"隐藏菜单栏set guioptions-=m"置空错误铃声的终端代码set vb t_vb="显示状态栏 (默认值为 1, 表示无法显示状态栏)set laststatus=2"粘贴不换行问题的解决方法set pastetoggle=<F9>"设置背景色set background=dark"设置高亮相关highlight Search ctermbg=black ctermfg=white guifg=white guibg=black"在Shell脚本的开头自动增加解释器及作者等版权信息autocmd BufNewFile *.py,*.cc,*.sh,*.java exec ":call SetTitle()"func SetTitle()if expand("%:e") == 'sh'call setline(1, "#!/bin/bash")call setline(2, "# Author: LiHua")call setline(3, "# Emal: 123456585@")call setline(4, "# Time: ".strftime("%F %T"))call setline(5, "# Name: ".expand("%"))call setline(6, "# Version: v1.0")call setline(7, "# Description: This is a Script.")endifendfunc

2、vim常用快捷操作

三、seq 序列化产生数字

3.1语法

seq [选项] 尾数或seq [选项] 首数 尾数或seq [选项] 首数 增量 尾数

以指定增量从首数开始打印数字到尾数,如果不指定首数默认从1开始。

3.2常用选项

-s

使用指定字符串分隔数字。默认是换行符\n

-w

在列前添加0 使得宽度相同【自动补位】

-f

格式化输出

"%02g" 表示位数不足两位的拿0补齐;

"%03g" 表示位数不足三位的拿0补齐;

也可以添加输出的字符串;

如果只写"%3g",不足三位数的位置就会空出来;

"%.2f"指定小数有几位;

四、练习题

1、创建一个脚本,执行脚本后让用户输入一个数字,程序可以由1+2+3...一直累加到用户输入的数字为止。终止的数字取值1-终止的数字做加法运算#!/bin/bashsum=0read -p "input a number: " numfor i in `seq $num`dosum=$[$sum+$i]doneecho $sum#!/bin/bashi=0add=0read -p "input a number: " numwhile [ $i -le $num ]doadd=$(($add+$i))i=$(($i+1))doneecho $add#! /bin/bashifread -p "please input one number: " numthenecho "seq 1 $num | awk '{sum += $1}END{print sum}'"fi2、创建一个脚本,将/etc/passwd中以:为分隔符的第一个域取出,并且在取出的每一行中都以“The 1account is “root” ”来表示,其中 1 表示行数。#!/bin/bashawk -F: '{ printf"The %s account is \"%s\"\n",NR,$1 }' /etc/passwd#! /bin/bashi=1a=`wc -l /etc/passwd|awk '{print $1}'`while [ $i -le $a ]doecho "The $i count is "`sed -n ${i}p /etc/passwd|cut -d ":" -f1`let i++done#!/bin/bashcount=1user=`awk -F":" '{print $1}' /etc/passwdfor i in $userdoecho "The $count account is $i "count=$[$count+1]done3、写一个脚本,判断192.168.1.0/24网络中,当前在线的IP有那些?#!/bin/bashi=1while [ $i -le 254 ]doping -c 1 192.168.11.$i &> /dev/nullif [ $? -eq 0 ]thenecho -e "192.168.11.$i 能ping通\n"elseecho -e "192.168.11.$i 不能ping通\n"fii=$[$i+1]done4、求100以内所有偶数之和,seq 100seq 2 2 1005、实现输入2个数可以进行加、减、乘、除功能的计算器提示:通过输入获得数字以及运算符号,然后计算please "输入2个数,进行加、减、乘、除( 2 + 2)"6、显示一个菜单给用户;cpu) display cpu informationmem) display memory informationdisk) display disks informationquit) quit要求:(1) 提示用户给出自己的选择;(2) 正确的选择则给出相应的信息;否则,则提示重新选择正确的选项;提示:例如正确选择了cpu则相应输出cpu信息echo cpu) display cpu informationecho mem) display memory informationecho disk) display disks informationecho quit) quitread -p "请选择cpu mem disk quit" ncase $n incpu)echomem)echo...esac7、写一个服务脚本变量$lockfile, 变量值为:/var/lock/subsys/SCRIPT_NAME(1) 此脚本可接受start, stop, restart, status四个参数之一;(2) 如果参数非此四者,则提示使用帮助后退出;(3) start,则创建lockfile,并显示启动;stop,则删除lockfile,并显示停止;restart,则先删除此文件再创建此文件,而后显示重启完成;status,如果lockfile存在,则显示running,否则,则显示为stopped.case $n instart)touch $lockfileecho "启动";;stop);;restart);;status);;*)echo "请使用帮助"esac8、统计Linux进程相关数量信息9、九九乘法表10、生成国际象棋棋盘提示:黄色块用yellow="\033[1;43m \033[0m",红色块用red="\033[1;41m \033[0m"cat << EOF###################欢迎登录系统1、注册用户2、登录系统3、退出##################EOFcase $num in1);;2);;3);;#!/bin/bash# Author: Nebula xiaoxing# Email: 454562487@# Time: -01-12 22:12:31# Name: 9*9.sh# Version: v1.0# Description: This is a Script.cat << EOF###################欢迎登录系统1、注册用户2、登录系统3、退出##################EOFuser=("system")passwd=("Nebula")function register_user(){for user in ${user[@]}doif [ $user == $1 ]thenecho "$user 已存在,不能注册"breakfidoneuser[1]=$1passwd[1]=$2echo "注册成功,用户名$1,密码$2"}function login_user(){if [ $user == $1 -a $passwd == $2]}main(){while :doread -p "请输入要操作的菜单号:" numcase $num in1)read -p "请输入要注册的用户名:" usernameread -sp "请输入用户$username的密码:" passwordregister_user $username $password;;2)read -p "请输入要登录的用户名:" usernameread -sp "请输入用户$username的密码:" passwordlogin_user $username $password;;3)echo "退出"exitesacdone}main

【Linux】shell编程5(Shell脚本常见错误示例 Shell脚本调试技巧 shell脚本开发环境配置和优化 vim常用快捷操作 seq 序列化产生数字)

如果觉得《【Linux】shell编程5(Shell脚本常见错误示例 Shell脚本调试技巧 shell脚本开发环境》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。