前言

在shell编程过程中,经常需要操作数组,命令返回的通常是字符串。如何根据指定的符号分割字符串?

这需要Internal Field Separator(IFS)变量。IFS的默认值为空格(包括空格、制表符和新行)

如果无法以Echo $IFS直接查看,则可以用ASSII代码以十六进制格式打印结果。

Echo -n '$IFS' | xxd -g 1

00000003360 20 090a……。

十六进制数20是32

十六进制数字09是9

十六进制0a是10

根据下图可以知道是什么符号

ASCII十进制数

分割字符串

如果要将其拆分为三个基本符号,则无需修改变量。

例子:

#!/bin/bash

a="one two three four"

array=($a)

for s in ${array[@]}

do

echo $s

done

执行结果:

如果是其他分割符,就需要修改这个变量。(修改的时候记得先保存一下变量,分割完就马上赋值回去,防止下面输出的格式变了)

例子:

#!/bin/bash

a="one,two,three,four"

OLD_IFS="$IFS"

IFS=","

array=($a)

IFS="$OLD_IFS"

for s in ${array[@]}

do

echo $s

done

执行结果:

array=($a)用于将字符串$a分割到数组$array ${array[0]} ${array[1]} … 分别存储分割后的数组第1 2 … 项 ,${arr[@]}存储整个数组。

IFS对空格的空白的处理和其他字符不一样,左右两边的纯空白会被忽略,多个连续的空白被当成一个IFS处理。

多个符号进行分割

#!/bin/bash

a="1,,,2::3"

OLD_IFS="$IFS"

IFS=",:"

array=($a)

IFS=OLD_IFS

for s in ${array[@]}

do

echo $s

done

执行结果:

总结

写shell脚本不好debug,很容易出错,可以使用bash -x 执行,来查看具体的执行步骤。shell脚本虽然方便,但是执行效率嘛。。。。。

相关推荐