1.调试脚本:
(1)选择-x,启用shell脚本的跟踪调试功能:sudo sh -x TestSleep.sh
(2)使用set -x和set +x,对脚本进行部分调试:
#!/bin/bash for i in {1..6}; do set -x #在执行时显示参数和命令 echo $i set +x #禁止调试 done echo "脚本执行完毕"
#set -v:当命令进行读取时显示输入
#set +v:禁止打印输入
运行结果:
(3)自定义格式显示调试信息:
#!/bin/bash function DEBUG() { [ "$_DEBUG" == "on" ] && $@ || : } for i in {1..10} do DEBUG echo $i done
运行结果:
(4)shebang的妙用:#!/bin/bash -xv 这样可以直接启动调试功能
2.函数和参数:
(1)Fork炸弹函数:递归函数(可以调用自身的函数),不断生成新的进程,最终造成拒绝服务攻击
#!/bin/bash
:(){ :|:&};:
3.将命令序列的输出读入变量:一个命令的输出可以作为另一个命令的输入,而这个命令的输出又会传递至另一个命令
ls | cat -n > out.txt //ls的输出(当前目录内容的列表)被传给cat -n ,后者将通过stdin所接收到输入内容加上行号,然后将输出重定向到文件out.txt
4.子Shell:读取由管道相连的命令序列的输出,子Shell本身就是独立的进程,可以使用 () 操作符来定义一个子Shell
cmd_output=$(ls | cat -n)
echo $cmd_output
pwd (cd /bin; ls) pwd
5.反标记:存储命令输出
cmd_output=`ls | cat -n`
echo $cmd_output
6.不使用回车符来读取n个字符:
#!/bin/bash #从输入中读取2个字符并存入变量中 read -n 2 var echo $var #用无回显的方式读取密码 read -s var #显示提示信息 read -p "Enter input:" var #在限定的2秒内键入的字符串读入变量var read -t 2 var #用特定的定界符作为输入行的结束 read -d ":" var
7.运行命令直至执行成功:
#!/bin/bash repeat() { while true do $@ && return done } repeat wget -c https://plugins.jetbrains.com/pluginManager/?action=download&id=org.jetbrains.plugins.textmate&build=PC-181.4445.76&uuid=bf9acdd8-e62c-4dcf-8d5e-ec210f5c8c2c //调用repeat函数,循环执行下载任务
创建了一个函数repeat,它包含一个无限while循环,该循环执行以参数形式(通过$@访问)传入函数的命令,如果命令执行成功,则返回,进而退出循环
repeat() { while :; do $@ && return ;done }
或者
repeat() { while :; do $@ && return ;sleep 30;done }
8.字段分隔符和迭代器:内部字段分隔符(IFS)是Shell脚本编程中的一个重要概念
#!/bin/bash data="name,sex,rollno,location" #IFS的默认值为空白字符(换行符,制表符或空格) oldIFS=$IFS #IFS被设置为逗号时,shell将被视为一个定界符,因此变量$item在每次迭代中读取由逗号分隔的字>串作为变量值 IFS=, for item in $data; do echo Item:$item done IFS=$oldIFS
实例:
#!/bin/bash IFS=":" count=0 for item in $line; do [ $count -eq 0 ] && user=$item; [ $count -eq 6 ] && shell=$item; let count++ done IFS=$oldIFS echo $user's shell is $shell
9.比较与测试:
(1)逻辑运算符:
[ condition ] && action ; //如果condition为真,则执行action,逻辑与运算符 && -a
[ conditon ] || action; //如果condition为假,则执行action,逻辑或运算符 || -o
(2)字符串比较:使用字符串比较时,最好用双中括号,因为有时候采用单个中括号会产生错误,所以最好避开他们
#!/bin/bash #[[ $str1 = $str2 ]]:当str1等于str2时。返回真,也就是说str1与str2包含的文本是一模一样的 #[[ $str1 != $str2 ]]:当str1与str2不相等时,返回真 #我们还可以检查字符串的字母序情况 #[[ $str1 > $str2 ]]:当str1的字母序比str2大时,返回真 #[[ $str1 < $str2 ]]:当str1的字母序比str2小时,返回真 #[[ -z $str1 ]] :如果str1包含的是空字符串,则返回真 #[[ -n $str1 ]] :如果str1包含的是非空字符串,则返回真 str1="Not empty " str2="" if [[ -n $str1 ]] && [[ -z $str2 ]] then echo str1 is nonempty and str2 is empty string.