第八章 内部字段分隔符IFS、脚本调试DEBUG

第八章 内部字段分隔符IFS、脚本调试DEBUG

内部字段分隔符

内部字段分隔符(internal field separator,IFS)是shell脚本中的一个特殊变量,在处理文本数据时很有用。把单个数据流划分成不同的数据元素的定界符,内部字段分隔符就是用于特定用途的定界符。IFS是存储定界符的环境变量,是shell环境中的默认定界符字符串,默认值为空白字符(换行符、制表符、空格)

迭代一个字符串或者CSV(comma separated value,都好分隔型数值)中的单词:

#!/bin/bash
data="111,222,333,444,555,666"

oldIFS=$IFS     #定义一个变量为默认IFS
IFS=,#设置IFS为逗号

for i in $data
do
  echo S:$i
done

IFS=$oldIFS     #还原IFS为默认值

运行结果:

S:111
S:222
S:333
S:444
S:555
S:666

上边示例 把IFS设置为逗号(,),shell将逗号解释为一个定界符,因此变量$i在每次迭代中读取由逗号分隔的字符串作为变量值。

shell脚本的调试

调试功能是每种编程语言都具备的特性之一,出现一些始料未及的情况,使用调试功能可以弄清除是什么原因发生了错误或者异常。shell脚本自身已经包含了调试的选项,能都打印出脚本接受的参数和输入。

1、使用选项 -x

​ -x :选项是打印所有行的信息

[root@ceshi ~]# bash -x 80.sh 
++ grep /boot
++ df -hT
++ cut -d % -f1
++ awk '{print $6}'
+ use=19
+ '[' 19 -lt 80 ']'
+ echo 'Warning!!/boot disk is full'
Warning!!/boot disk is full

或者
[root@ceshi ~]# sh -x 80.sh 
++ df -hT
++ cut -d % -f1
++ awk '{print $6}'
++ grep /boot
+ use=19
+ '[' 19 -lt 80 ']'
+ echo 'Warning!!/boot disk is full'
Warning!!/boot disk is full

2、使用set +/-x;set +/-v

  • set -x:在执行时候显示参数和命令
  • set +x:禁止调试
  • set -v:当命令进入读取时候显示输入
  • set +v:禁止打印输入

示例

#!/bin/bash

for i in {1..5}
do
set -x
  echo $i
set +x
done

echo "end"

运行结果:
1
2
3
4
5
end
+ echo 1
+ set +x
+ echo 2
+ set +x
+ echo 3
+ set +x
+ echo 4
+ set +x
+ echo 5
+ set +x

上例中,仅在-x和+x的区域中才会显示调试信息。

3、使用_DEBUG 环境变量

如果需要自定义格式显示调试信息可以通过_DEBUG环境变量来建立:

[root@ceshi ~]# vi d.sh
#!/bin/bash

DEBUG() {
[ "$_DEBUG" = "on" ] && $@ || :
}

for i in {1..5}
do
DEBUG echo $i
done

将调试功能设置为“on”来运行脚本:

[root@ceshi ~]# _DEBUG=on ./d.sh
1
2
3
4
5

将需要调试的行前加上DEBUG,运行脚本前没有加_DEBUG=on就不会显示任何信息,脚本中 ":" 告诉shell不要进行任何操作。

4、使用shebang调试方法

这个最便捷的方法。把shebang从 #!/bin/bash 修改成#!/bin/bash -xv,其他就不用做任何操作了。

示例:

[root@ceshi ~]#  cat dd.sh 
#!/bin/bash -xv

for i in {1..5}
do
  echo $i
done

运行结果:
[root@ceshi ~]# ./dd.sh 
#!/bin/bash -xv

for i in {1..5}
do
  echo $i
done
+ for i in '{1..5}'     #从这里开始debug
+ echo 1
1
+ for i in '{1..5}'
+ echo 2
2
+ for i in '{1..5}'
+ echo 3
3
+ for i in '{1..5}'
+ echo 4
4
+ for i in '{1..5}'
+ echo 5
5

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


用的openwrt路由器,家里宽带申请了动态公网ip,为了方便把2280端口映射到公网,发现经常被暴力破解,自己写了个临时封禁ip功能的脚本,实现5分钟内同一个ip登录密码错误10次就封禁这个ip5分钟,并且进行邮件通知使用步骤openwrt为19.07.03版本,其他版本没有测试过安装bashmsmtpopkg
#!/bin/bashcommand1&command2&wait从Shell脚本并行运行多个程序–杨河老李(kviccn.github.io)
1.先查出MAMP下面集成的PHP版本cd/Applications/MAMP/bin/phpls-ls 2.编辑修改.bash_profile文件(没有.bash_profile文件的情况下回自动创建)sudovim~/.bash_profile在文件的最后输入以下信息,然后保存退出exportPATH="/Applications/MAMP/bin/php/php7.2.20/b
1、先输入locale-a,查看一下现在已安装的语言2、若不存在如zh_CN之类的语言包,进行中文语言包装:apt-getinstalllanguage-pack-zh-hans3、安装好后我们可以进行临时修改:然后添加中文支持: locale-genzh_CN.UTF-8临时修改> export LC_ALL='zh_CN.utf8'> locale永久
BashPerlTclsyntaxdiff1.进制数表示Languagebinaryoctalhexadecimalbash2#[0~1]0[0~7]0x[0~f]or0X[0~f]perl0b[0~1]0[0~7]0x[0~f]tcl0b[0~1]0o[0~7]0x[0~f]bashdifferentbaserepresntationreference2.StringlengthLanguageStr
正常安装了k8s后,使用kubect工具后接的命令不能直接tab补全命令补全方法:yum-yinstallbash-completionsource/usr/share/bash-completion/bash_completionsource<(kubectlcompletionbash)echo"source<(kubectlcompletionbash)">>~/.bashrc 
参考这里启动jar包shell脚本修改过来的#!/bin/bash#默认应用名称defaultAppName='./gadmin'appName=''if[[$1&&$1!=0]]thenappName=$1elseappName=$defaultAppNamefiecho">>>>>>本次重启的应用:$appName<
#一个数字的行#!/bin/bashwhilereadlinedon=`echo$line|sed's/[^0-9]//g'|wc-L`if[$n-eq1]thenecho$linefidone<1.txt#日志切割归档#!/bin/bashcd/data/logslog=1.logmv_log(){[-f$1]&&mv$1$2
#文件增加内容#!/bin/bashn=0cat1.txt|whilereadlinedon=[$n+1]if[$n-eq5]thenecho$lineecho-e"#Thisisatestfile.\n#Testinsertlineintothisfile."elseecho$linefidone#备份/etc目录#
# su - oraclesu: /usr/bin/ksh: No such file or directory根据报错信息:显示无法找到文件 /usr/bin/ksh果然没有该文件,但是发现存在文件/bin/ksh,于是创建了一个软连接,可以规避问题,可以成功切换到用户下,但无法执行系统自带命令。$. .bash_profile-ksh: .: .b
history显示历史指令记录内容,下达历史纪录中的指令主要的使用方法如果你想禁用history,可以将HISTSIZE设置为0:#exportHISTSIZE=0使用HISTIGNORE忽略历史中的特定命令下面的例子,将忽略pwd、ls、ls-ltr等命令:#exportHISTIGNORE=”pwd:ls:ls-ltr:”使用HIS
一.命令历史  1.history环境变量:    HISTSIZE:输出的命令历史条数,如history的记录数    HISTFILESIZE:~/.bash_history保存的命令历史记录数    HISTFILLE:历史记录的文件路径    HISTCONTROL:     ignorespace:忽略以空格开头的命令
之前在网上看到很多师傅们总结的linux反弹shell的一些方法,为了更熟练的去运用这些技术,于是自己花精力查了很多资料去理解这些命令的含义,将研究的成果记录在这里,所谓的反弹shell,指的是我们在自己的机器上开启监听,然后在被攻击者的机器上发送连接请求去连接我们的机器,将被攻击者的she
BashOne-LinersExplained,PartI:Workingwithfileshttps://catonmat.net/bash-one-liners-explained-part-oneBashOne-LinersExplained,PartII:Workingwithstringshttps://catonmat.net/bash-one-liners-explained-part-twoBashOne-LinersExplained,PartII
Shell中变量的作用域:在当前Shell会话中使用,全局变量。在函数内部使用,局部变量。可以在其他Shell会话中使用,环境变量。局部变量:默认情况下函数内的变量也是全局变量#!/bin/bashfunctionfunc(){a=99}funcecho$a输出>>99为了让全局变量变成局部变量
1、多命令顺序执行;  命令1;命令2  多个命令顺序执行,命令之间没有任何逻辑联系&&  命令1&&命令2  逻辑与,当命令1正确执行,才会执行命令2||  命令1||命令2  逻辑或,当命令1执行不正确,才会执行命令2例如:ls;date;cd/home/lsx;pwd;who ddif=输入文件of=输
原博文使用Linux或者unix系统的同学可能都对#!这个符号并不陌生,但是你真的了解它吗?首先,这个符号(#!)的名称,叫做"Shebang"或者"Sha-bang"。Linux执行文件时发现这个格式,会把!后的内容提取出来拼接在脚本文件或路径之前,当作实际执行的命令。 Shebang这个符号通常在Unix系统的脚本
1、历史命令history[选项][历史命令保存文件]选项:-c:  清空历史命令-w:  把缓存中的历史命令写入历史命令保存文件 ~/.bash_historyvim/etc/profile中的Histsize可改存储历史命令数量历史命令的调用使用上、下箭头调用以前的历史命令使用“!n”重复执行第n条历史
目录1.Shell脚本规范2.Shell脚本执行3.Shell脚本变量3.1环境变量3.1.1自定义环境变量3.1.2显示与取消环境变量3.1.3环境变量初始化与对应文件的生效顺序3.2普通变量3.2.1定义本地变量3.2.2shell调用变量3.2.3grep调用变量3.2.4awk调用变量3.3
   http://www.voidcn.com/blog/wszzdanm/article/p-6145895.html命令功能:显示登录用户的信息命令格式:常用选项:举例:w显示已经登录的用户及正在进行的操作[root@localhost~]#w 11:22:01up4days,21:22, 3users, loadaverage:0.00,0.00,0.00USER