【问题标题】:Unset IFS value for shell script取消设置 shell 脚本的 IFS 值
【发布时间】:2014-06-15 06:16:19
【问题描述】:

在我的用例中,我想将 IFS 的值更改为已知的分隔符 (-)。我尝试了以下方法:

OLDIFS=$IFS
IFS='-'
for x in $*
do
    echo $x
done
IFS=$OLDIFS

当使用例如-a b -c d 作为输入字符串,我希望输出是

a b
c d

然而,我得到的是

a
b
c
d

我在AIX

【问题讨论】:

  • 确保您将一个参数传递给您的 shell 脚本。 ./foo "-a b -c d" 应该会产生你想要的结果
  • 您的预期结果是错误的,这将返回一个空行,然后是a b ,然后是c d。如果您从 IFS 中删除空格,它们将不会用作分隔符,从而导致第一个标记为空,第二个标记中有一个尾随空格。
  • 是的,空行没问题,我只想返回一个原子令牌a b@AdrianFrühwirth
  • @Aymanadou 但是a b != a b
  • @Aymanadou 哦...请不要烘焙您自己的参数解析器,请改用getopts

标签: shell ksh aix ifs


【解决方案1】:

我试过你的代码,我得到了

a b
c d

试试这个

$ cat >a <<.
#!/bin/sh
OLDIFS=$IFS
IFS='-'
for x in $*
do
    echo $x
done
IFS=$OLDIFS
.
$ chmod +x a
$ ./a "-a b -c d"

a b
c d
$

【讨论】:

  • 我在 AIX 环境中,结果很糟糕。
  • 你使用的是什么外壳?
  • 你用什么shell来启动你的shell脚本,你用什么shell来运行你的shell脚本(shebang之后是什么)(这些可以不同)
  • 我试过 #!/bin/ksh 和 #!/bin/sh 两者都给出了同样糟糕的结果
【解决方案2】:

这是使用awk 获取此输出并避免所有IFS 操作的一种方法:

s='-a b -c d'
echo "$s" | awk -F ' *- *' '{print $2 RS $3}'
a b
c d

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-03-25
    • 2015-07-25
    • 2020-05-07
    • 2014-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多