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

你可能感兴趣的:(Linux,linux,运维,shell)