为什么这个bash脚本不能分割字符串?

3
我正在尝试使用空格作为分隔符来拆分由两个单词组成的字符串,但是以下代码片段对我没有起作用:
$ cat > test.sh
#/bin/bash
NP="3800 480"
IFS=" "
echo $NP
echo $NP | read VAR1 VAR2
echo "Var1 : $VAR1"
echo "Var2 : $VAR2"
exit 0

调用它会给我:

$ chmod 755 ./test.sh && ./test.sh
3800 480
Var1 :
Var2 :

我希望您能看到:

3800 480
Var1 : 3800
Var2 : 480

如何在bash脚本中分割一个简单的字符串?

编辑: (我使用的答案) 感谢jw013提供的链接,我成功想出了这个适用于bash 2.04的解决方案:

$ cat > test.sh
#!/bin/bash
NP="3800 480"
read VAR1 VAR2 << EOF
$NP
EOF
echo $VAR2 $VAR1

$./test.sh
480 3800
4个回答

3
问题在于该管道涉及到一个分支,因此您需要确保其余的脚本在执行读取操作的 shell 中执行。
只需按照以下方式添加 ( ... ) 即可:
. . .
echo $NP | (read VAR1 VAR2
  echo "Var1 : $VAR1"
  echo "Var2 : $VAR2"
  exit 0
)

感谢您的解释。点一下并检查。 - Jamie
但是作为一个后续问题,我如何“看到”括号外的变量呢? - Jamie
你可以将它们回显到父级并使用命令替换来捕获它们。但是在管道之后运行的两个脚本都是原始脚本的几乎完全相同的副本,那么为什么不将其余的脚本放在括号中呢?我想你也可以调用一个shell过程来执行剩余的功能。该过程可以在括号外定义。(也就是说,在子shell之外。) - DigitalRoss

3
使用bash,您可以使用“here string”(将输入从字符串重定向):<<<
$ NP="3800 480"
$ read VAR1 VAR2 <<< $NP   # NB, variable is not quoted
$ echo $VAR2 $VAR1
480 3800

有趣的是,但不幸的是,我正在使用 bash 2.04,在脚本中使用时会出现“语法错误,附近意外的标记 '<<<'”。 - Jamie

2
#!/bin/bash
NP="3800 480"
IFS=" "
array=($NP)
echo ${array[0]}
echo ${array[1]}

同样可行


不错,但只是一个基于Bash的解决方案。 - DigitalRoss
不错,但只有bash的解决方案。这很好,因为OP正在寻求bash解决方案。如果eckes调用的是bash而不是bourne,我甚至会点赞这个解决方案。;-) - Daniel Haley

2
请查看BashFAQ 024,了解更多关于如何使用read以便稍后访问变量的内容。
我最喜欢的解决方案(比仅适用于bash的解决方案更加便携)是以下示例代码:
read -r ... << EOF
$NP
EOF

虽然你提供了我需要的答案,但是我的主要问题已经被之前回答过了。不过还是非常感谢你。 - Jamie

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接