【问题标题】:Bash scripting with IFS使用 IFS 编写 Bash 脚本
【发布时间】:2018-04-27 22:32:45
【问题描述】:

我需要在 Bash 中使用 IFS=','

./test.sh 迈克,德克萨斯尼克,多伦多卢卡斯,爱荷华

你好迈克

你来自德克萨斯

你好尼克

你来自多伦多

卢卡斯你好

你来自爱荷华州

#!/bin/bash
    IFS=',' read -r -a array <<< "$string"


    for index in "${!array[@]}"
    do
            echo Hello "$index ${array[index]}"
            echo You are from "$index ${array[index]}"
    done

【问题讨论】:

  • 你应该详细说明你想要达到的目标。
  • 您的 Q 应该包括您解决问题的最佳尝试。我们会帮助您修复它,但我们不想为您做这件事。祝你好运。
  • 对不起,你说得对。

标签: bash ifs


【解决方案1】:

您不需要修改IFS内部字段分隔符),您需要去除子字符串的参数扩展,例如

#!/bin/bash

for i in "$@"; do
    printf "Hello %s\nYou are from %s\n" "${i%,*}" "${i#*,}"
done

使用/输出示例

$ ./test.sh Mike,Texas Nik,Toronto Lucas,Iowa
Hello Mike
You are from Texas
Hello Nik
You are from Toronto
Hello Lucas
You are from Iowa

【讨论】:

  • 非常感谢。我喜欢你的回答,非常巧妙。我不明白的是......(%,*)和(#*,)你能给我解释一下吗?再次感谢您
  • 称为带子串去除的参数扩展${var#*,}var 中的字符串从左侧修剪到并包括 1st 逗号,${var%,*} 从右侧执行相同的操作(注意 '*' 通配符)。您可以使用 ${var##*,} 从左侧修剪到并包括 last 逗号,并使用 ${var%%,*} 从右侧修剪相同的内容。它在 man bash 中的标题 参数扩展 下进行了解释。
  • 如果它回答了您的问题,请参阅What should I do when someone answers my question?
【解决方案2】:

您可以仅使用 for argument 循环参数 - 这将使用空格分隔的参数填充名为 argument 的变量一次。然后您可以读取逗号分隔的值。例如:

set -- Mike,Texas Nik,Toronto Lucas,Iowa # For testing purposes
for argument
do
    IFS=, read name state <<< "$parameter"
    echo "Hello ${name}"
    echo "You are from ${state}"
done

【讨论】:

    【解决方案3】:

    根据我所看到的,这是我的建议:

    for i in $* ; do
    
         name=$(echo $i | awk -F, '{print $1}' )
         wherefrom=$(echo $i | awk -F, '{print $2'})
    
         echo Hello $name, you are from $wherefrom
    done
    

    【讨论】:

    • 为什么是两个awks? echo $i | awk -F, '{print "Hello",$1,"you are from " $2}'。顺便说一句,for i 就足够了(你不需要in $*)。
    • 非常感谢。您的回答非常成功。
    • cdarke - 您的解决方案和我的解决方案都有效。你的更简洁,因此对于给定的问题可能更好。我的解决方案将名称和目的地提取到变量中,这在一些更复杂的上下文中可能很有用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-29
    • 2018-12-05
    • 1970-01-01
    • 1970-01-01
    • 2013-10-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多