为什么这个bash脚本没有拆分字符串?

时间:2011-08-03 18:32:07

标签: bash scripting

我正在尝试拆分一个字符串,其中两个单词用空格分隔,这段代码对我不起作用:

$ 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 个答案:

答案 0 :(得分:3)

问题是管道涉及到fork,因此您需要确保脚本的其余部分在执行读取的shell中执行。

只需添加( ... ),如下所示:

. . .
echo $NP | (read VAR1 VAR2
  echo "Var1 : $VAR1"
  echo "Var2 : $VAR2"
  exit 0
)

答案 1 :(得分:3)

使用bash,您可以使用<<<(“here string”,从字符串重定向输入):

$ NP="3800 480"
$ read VAR1 VAR2 <<< $NP   # NB, variable is not quoted
$ echo $VAR2 $VAR1
480 3800

答案 2 :(得分:2)

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

也可以使用

答案 3 :(得分:2)

请查看BashFAQ 024了解有关使用read的更多信息,以便稍后可以访问这些变量。

我最喜欢的解决方案(比仅限bash更便携)是这里的文档:

read -r ... << EOF
$NP
EOF