Shell脚本攻略之小试牛刀2

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.
原文地址:https://www.cnblogs.com/hqutcy/p/8819409.html