AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 413756
Accepted
user267935
user267935
Asked: 2017-12-30 18:11:14 +0800 CST2017-12-30 18:11:14 +0800 CST 2017-12-30 18:11:14 +0800 CST

bash 根据“IFS”变量的值改变其行为

  • 772

当我将IFS变量设置为一个空格时,bash将多个空格视为一个空格(myprogram是一个打印它接收到的命令行参数的程序):

IFS=" "
x="hello   hi   world"
./myprogram $x
argv[1] = hello
argv[2] = hi
argv[3] = world

但是当我将IFS变量设置为逗号时,bash不会将多个逗号视为一个逗号:

IFS=","
x="hello,,,hi,,,world"
./myprogram $x
argv[1] = hello
argv[2] = 
argv[3] = 
argv[4] = hi
argv[5] = 
argv[6] = 
argv[7] = world

这是为什么?

bash shell
  • 1 1 个回答
  • 710 Views

1 个回答

  • Voted
  1. Best Answer
    John1024
    2017-12-30T18:22:40+08:002017-12-30T18:22:40+08:00

    这记录在man bash. IFS 中任何非空格字符的单次出现都会分隔一个字段。

    来自man bash:

    Shell 将 IFS 的每个字符视为分隔符,并将其他扩展的结果拆分为使用这些字符作为字段终止符的单词。如果 IFS 未设置,或者它的值恰好<space><tab><newline>是默认值,则忽略先前扩展结果的开头和结尾处的 、 和 序列<space>, <tab>并且<newline>不在开头或结尾处的任何 IFS 字符序列用于分隔字。如果 IFS 的值不是默认值,则在单词的开头和结尾处忽略空格字符、制表符和换行符的序列,只要空格字符在 IFS 的值中(IFS 空格字符)。 IFS 中不是 IFS 空白的任何字符,以及任何相邻的 IFS 空白字符,都会分隔一个字段。IFS 空白字符序列也被视为分隔符。 如果 IFS 的值为空,则不发生分词。[强调补充。]

    示例:字段拆分

    如果 IFS 没有空格字符,则空格包含在字段中:

    $ ( IFS=',' x='one , two,three'; printf "<%s>\n" $x )
    <one >
    < two>
    <three>
    

    如果 IFS 同时包含空格和逗号,则空格序列、后跟逗号、后跟空格序列被视为单个分隔符:

    $ ( IFS=' ,' x='one , two,three'; printf "<%s>\n" $x )
    <one>
    <two>
    <three>
    

    逗号序列被解释为空字段序列:

    $ ( IFS=' ,' x='one,,,two,three'; printf "<%s>\n" $x )
    <one>
    <>
    <>
    <two>
    <three>
    

    示例:前导和尾随空格

    如果 IFS 不包含空格,则任何前导和尾随空格都保留在字段中:

    $ ( IFS=',' x='  one , two,three  ,'; printf "<%s>\n" $x )
    <  one >
    < two>
    <three  >
    

    如果 IFS 确实包含空格,则删除任何前导或尾随的空格序列:

    $ ( IFS=' ,' x='  one , two,three  ,'; printf "<%s>\n" $x )
    <one>
    <two>
    <three>
    
    • 20

相关问题

  • 从文本文件传递变量的奇怪问题

  • 虽然行读取保持转义空间?

  • 如何将带有〜的路径保存到变量中?

  • `tee` 和 `bash` 进程替换顺序

  • 运行一个非常慢的脚本直到它成功

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    JSON数组使用jq来bash变量

    • 4 个回答
  • Marko Smith

    日期可以为 GMT 时区格式化当前时间吗?[复制]

    • 2 个回答
  • Marko Smith

    bash + 通过 bash 脚本从文件中读取变量和值

    • 4 个回答
  • Marko Smith

    如何复制目录并在同一命令中重命名它?

    • 4 个回答
  • Marko Smith

    ssh 连接。X11 连接因身份验证错误而被拒绝

    • 3 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Marko Smith

    systemctl 命令在 RHEL 6 中不起作用

    • 3 个回答
  • Marko Smith

    rsync 端口 22 和 873 使用

    • 2 个回答
  • Marko Smith

    以 100% 的利用率捕捉 /dev/loop -- 没有可用空间

    • 1 个回答
  • Marko Smith

    jq 打印子对象中所有的键和值

    • 2 个回答
  • Martin Hope
    EHerman JSON数组使用jq来bash变量 2017-12-31 14:50:58 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST
  • Martin Hope
    Drux 日期可以为 GMT 时区格式化当前时间吗?[复制] 2017-12-26 11:35:07 +0800 CST
  • Martin Hope
    AllisonC 如何复制目录并在同一命令中重命名它? 2017-12-22 05:28:06 +0800 CST
  • Martin Hope
    Steve “root”用户的文件权限如何工作? 2017-12-22 02:46:01 +0800 CST
  • Martin Hope
    Bagas Sanjaya 为什么 Linux 使用 LF 作为换行符? 2017-12-20 05:48:21 +0800 CST
  • Martin Hope
    Cbhihe 将默认编辑器更改为 vim for _ sudo systemctl edit [unit-file] _ 2017-12-03 10:11:38 +0800 CST
  • Martin Hope
    showkey 如何下载软件包而不是使用 apt-get 命令安装它? 2017-12-03 02:15:02 +0800 CST
  • Martin Hope
    youxiao 为什么目录 /home、/usr、/var 等都具有相同的 inode 编号 (2)? 2017-12-02 05:33:41 +0800 CST
  • Martin Hope
    user223600 gpg —list-keys 命令在将私钥导入全新安装后输出 uid [未知] 2017-11-26 18:26:02 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve