SHELL IFS分隔符

SHELL IFS分隔符

IFS默认值

  • IFS 是一种 set 变量,当 shell 处理"命令替换"和"参数替换"时,shell 根据 IFS 的值,默认是 space, tab, newline 来拆解读入的变量,然后对特殊字符进行处理,最后重新组合赋值给该变量

  • Shell 的环境变量分为 set, env 两种,其中 set 变量可以通过 export 工具导入到 env 变量中。其中,set 是显示设置shell变量,仅在本 shell 中有效;env 是显示设置用户环境变量 ,仅在当前会话中有效。换句话说,set 变量里包含了 env 变量,但 set 变量不一定都是 env 变量。这两种变量不同之处在于变量的作用域不同。显然,env 变量的作用域要大些,它可以在 subshell 中使用

  • IFS是内部字段分隔符(internal field separator)。默认情况下,bash shell会将空格、制表符、换行符 当做字段分隔符。

    • IFS=$‘\n’:;" 就是将换行符、冒号、分号、双引号作为字段分隔符
    • IFS=‘\n’ //将字符\和字符n作为IFS的换行符。
    • IFS=$‘\n’ //真正的使用换行符做为字段分隔符。
    • IFS=‘\n’:;" //将反斜杠、n、冒号、分号和双引号作为字段分隔符
# 查看IFS默认值
[root@k8s-master-1 ~]# echo "$IFS" | cat -et
 ^I$
$
  • 空格分隔字符串,可见在遍历的时候,默认以空格进行切割了
[root@k8s-master-1 ~]# string="foo bar foobar"
[root@k8s-master-1 ~]# for i in $string; do
>  echo "'$i' is the substring"
> done
'foo' is the substring
'bar' is the substring
'foobar' is the substring
  • 以制表符分隔
[root@k8s-master-1 ~]# for i in `echo -e "foo\tbar\tfoobar"`; do echo "'$i' is the substring"; done
'foo' is the substring
'bar' is the substring
'foobar' is the substring
  • 以换行符分隔
[root@k8s-master-1 ~]# string="foo
> bar
> foobar"
[root@k8s-master-1 ~]# for i in $string ; do echo $i ; done
foo
bar
foobar

自定义IFS符

  • 案例一
# 
[root@k8s-master-1 ~]# string=foo:bar:foobar
[root@k8s-master-1 ~]# IFS=":"
[root@k8s-master-1 ~]# for i in $string ; do echo $i ; done
foo
bar
foobar
  • 案例二
[root@k8s-master-1 ~]# echo "$IFS" | cat -et
 ^I$
$
[root@k8s-master-1 ~]# string="foo bar foo:bar"
[root@k8s-master-1 ~]# for i in $string; do echo "[$i] extracted"; done
[foo] extracted
[bar] extracted
[foo:bar] extracted

[root@k8s-master-1 ~]# IFS=":"  && echo "$IFS" | cat -et
:$
[root@k8s-master-1 ~]# for i in $string; do echo "[$i] extracted"; done
[foo bar foo] extracted
[bar] extracted

[root@k8s-master-1 ~]# unset IFS  && echo "$IFS" | cat -et
$
[root@k8s-master-1 ~]# for i in $string; do echo "[$i] extracted"; done
[foo] extracted
[bar] extracted
[foo:bar] extracted
  • 案例三,如果我们将 IFS 设置为空字符串,那么 Bash 将不会执行任何拆分操作:
[root@k8s-master-1 ~]# IFS=""
[root@k8s-master-1 ~]# for i in $string; do echo "[$i] extracted"; done
[foo bar foo:bar] extracted
  • 案例四
#! /bin/bash
while IFS="," read -r rec_column1 rec_column2 rec_column3 rec_column4
do
 echo "Displaying Record-$rec_column1"
 echo "Quantity: $rec_column2"
 echo "Price: $rec_column3"
 echo "Value: $rec_column4"
 echo ""
done < <(tail -n +2 input.csv)
  • 案例五:IFS在 @ / @/ @/*的区别
[root@k8s-master-1 ~]# cat 1.sh 
#!/bin/bash
echo " Input Parameters using \$@ : $@"
echo " Input Parameters using \$* : $*"

[root@k8s-master-1 ~]# ./1.sh arg1 arg2 arg3
 Input Parameters using $@ : arg1 arg2 arg3
 Input Parameters using $* : arg1 arg2 arg3
 
 
[root@k8s-master-1 ~]# cat 1.sh 
#!/bin/bash
IFS='|'
echo " Input Parameters using \$@ : $@"
echo " Input Parameters using \$* : $*"

[root@k8s-master-1 ~]# ./1.sh arg1 arg2 arg3
 Input Parameters using $@ : arg1 arg2 arg3
 Input Parameters using $* : arg1|arg2|arg3
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

旺仔_牛奶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值