一、Shell脚本调试
1、Shell脚本常见错误示例
1.1 if条件语句缺少结尾关键字
1 #!/bin/bash
2 if [ 1 -lt 2 ];then
3 echo "Yes"
4
[root@node1 ~]# sh test.sh =====>执行之后报错如下
test.sh: line 4: syntax error: unexpected end of file
#第四行报语法错误,这不是所期待的文件结尾,发现缺少了fi
1.2 循环语句缺少关键字
1 #!/bin/bash
2 if [ 1 -lt 2 ];the <=========== 这里缺少一个n,应该为then
3 echo "Yes"
4 fi
[root@node1 ~]# sh test.sh
test.sh: line 4: syntax error near unexpected token `fi'
test.sh: line 4: `fi'
#报错第四行附近有错误
1.3 成对的符号落单
成对的符号有[],(),{},"",'',``,如果落单了,也会导致一些错误
1 #!/bin/bash
2 a="123
3 b="456"
4 c="a+b"
5 echo $c
[root@node1 ~]# sh test.sh
test.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/bash
2 if [1 -lt2 ];then
3 echo "YES"
4 fi
[root@node1 ~]# sh test.sh
test.sh: line 2: [1: command not found <======提示第二行[1有问题
2、Shell脚本调试技巧
2.1使用echo命令调试
#!/bin/bash
#create by nebula
#date:20190525
#dec:int compare
read -p "please input teo num: " a b
echo $a $b # 增加打印输出,确认变量值是否符合要求。
#exit #退出脚本
#if [ $a -lt $b ]
if (($a < $b))
then
echo "$a < $b"
elif [ $a -eq $b ]
then
echo "$a=$b"
else
echo "$a>$b"
fi
[root@nebulalinux03 ~]# . debug.sh
please input teo num: 99 100
99 100
99 < 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 2019-08-29
" Created by xiaoxing
"
"""""""""""""""""""""
" => 全局配置
"""""""""""""""""""""
"关闭兼容模式
set nocompatible
"设置历史记录步数
set history=1000
"开启相关插件
filetype on
filetype plugin on
filetype indent on
"当文件在外部被修改时,自动更新该文件
set autoread
"激活鼠标的使用
"set mouse=a
"""""""""""""""""""""
" => 字体和颜色
"""""""""""""""""""""
"开启语法
syntax enable
"设置字体
set guifont=dejaVu\ Sans\ MONO\ 10
""设置配色
colorscheme desert
"高亮显示当前行
set cursorline
hi cursorline guibg=#00ff00
hi CursorColumn guibg=#00ff00
"""""""""""""""""""""
" => 文字处理 by Nebula xiaoxing
"""""""""""""""""""""
"使用空格来替换Tab
set expandtab
"设置所有的Tab和缩进为4个空格
set tabstop=4
"设定 << 和 >> 命令移动时的宽度为4
set shiftwidth=4
"使得按退格键时可以一次删掉4个空格
set softtabstop=4
set 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 menu
set wildmenu
"显示标尺
set ruler
"设置命令行的高度
set cmdheight=1
"显示行数
set nu
"Do not redraw, when running macros.. lazyredraw
set lz
"设置退格
set backspace=eol,start,indent
"Bbackspace and cursor keys wrap to
set whichwrap+=<,>,h,l
"Set magic on(设置魔术)
set magic
"关闭遇到错误时的声音提示
"关闭错误信息响铃
set noerrorbells
"关闭使用可视响铃代替呼叫
set novisualbell
"显示匹配的括号([{和}])
set showmatch
"How many tenths of a second to blink
set 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 2019
"""""""""""""""""""""
"开启新行时使用智能自动缩进
set smartindent
set cin
set 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@qq.com")
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.")
endif
endfunc
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/bash
sum=0
read -p "input a number: " num
for i in `seq $num`
do
sum=$[$sum+$i]
done
echo $sum
#!/bin/bash
i=0
add=0
read -p "input a number: " num
while [ $i -le $num ]
do
add=$(($add+$i))
i=$(($i+1))
done
echo $add
#! /bin/bash
if
read -p "please input one number: " num
then
echo "seq 1 $num | awk '{sum += $1}END{print sum}'"fi
2、创建一个脚本,将/etc/passwd中以:为分隔符的第一个域取出,并且在取出的每一行中都以“The 1
account is “root” ”来表示,其中 1 表示行数。
#!/bin/bash
awk -F: '{ printf"The %s account is \"%s\"\n",NR,$1 }' /etc/passwd
#! /bin/bash
i=1
a=`wc -l /etc/passwd|awk '{print $1}'`
while [ $i -le $a ]
do
echo "The $i count is "`sed -n ${i}p /etc/passwd|cut -d ":" -f1`
let i++
done
#!/bin/bash
count=1
user=`awk -F":" '{print $1}' /etc/passwd
for i in $user
do
echo "The $count account is $i "
count=$[$count+1]
done
3、写一个脚本,判断192.168.1.0/24网络中,当前在线的IP有那些?
#!/bin/bash
i=1
while [ $i -le 254 ]
do
ping -c 1 192.168.11.$i &> /dev/null
if [ $? -eq 0 ]
then
echo -e "192.168.11.$i 能ping通\n"
else
echo -e "192.168.11.$i 不能ping通\n"
fi
i=$[$i+1]
done
4、求100以内所有偶数之和,
seq 100
seq 2 2 100
5、实现输入2个数可以进行加、减、乘、除功能的计算器
提示:通过输入获得数字以及运算符号,然后计算
please "输入2个数,进行加、减、乘、除( 2 + 2)"
6、显示一个菜单给用户;
cpu) display cpu information
mem) display memory information
disk) display disks information
quit) quit
要求:
(1) 提示用户给出自己的选择;
(2) 正确的选择则给出相应的信息;否则,则提示重新选择正确的选项;
提示:例如正确选择了cpu则相应输出cpu信息
echo cpu) display cpu information
echo mem) display memory information
echo disk) display disks information
echo quit) quit
read -p "请选择cpu mem disk quit" n
case $n in
cpu)
echo
mem)
echo
...
esac
7、写一个服务脚本
变量$lockfile, 变量值为:/var/lock/subsys/SCRIPT_NAME
(1) 此脚本可接受start, stop, restart, status四个参数之一;
(2) 如果参数非此四者,则提示使用帮助后退出;
(3) start,则创建lockfile,并显示启动;stop,则删除lockfile,并显示停止;restart,则
先删除此文件再创建此文件,而后显示重启完成;status,如果lockfile存在,则显示running,否则,则
显示为stopped.
case $n in
start)
touch $lockfile
echo "启动"
;;
stop)
;;
restart)
;;
status)
;;
*)
echo "请使用帮助"
esac
8、统计Linux进程相关数量信息
9、九九乘法表
10、生成国际象棋棋盘
提示:黄色块用yellow="\033[1;43m \033[0m",红色块用red="\033[1;41m \033[0m"
cat << EOF
###################
欢迎登录系统
1、注册用户
2、登录系统
3、退出
##################
EOF
case $num in
1)
;;
2)
;;
3)
;;
#!/bin/bash
# Author: Nebula xiaoxing
# Email: 454562487@qq.com
# Time: 2023-01-12 22:12:31
# Name: 9*9.sh
# Version: v1.0
# Description: This is a Script.
cat << EOF
###################
欢迎登录系统
1、注册用户
2、登录系统
3、退出
##################
EOF
user=("system")
passwd=("Nebula")
function register_user(){
for user in ${user[@]}
do
if [ $user == $1 ]
then
echo "$user 已存在,不能注册"
break
fi
done
user[1]=$1
passwd[1]=$2
echo "注册成功,用户名$1,密码$2"
}
function login_user(){
if [ $user == $1 -a $passwd == $2]
}
main(){
while :
do
read -p "请输入要操作的菜单号:" num
case $num in
1)
read -p "请输入要注册的用户名:" username
read -sp "请输入用户$username的密码:" password
register_user $username $password
;;
2)
read -p "请输入要登录的用户名:" username
read -sp "请输入用户$username的密码:" password
login_user $username $password
;;
3)
echo "退出"
exit
esac
done
}
main