2011-08-03 65 views
3

我試圖分裂與空格分隔兩個單詞的字符串,而這個片斷是不是爲我工作:這個bash腳本爲什麼不分割字符串?

$ 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 

回答

3

的問題是,管道涉及到一個分支,因此您需要確保腳本的其餘部分在執行讀取的shell中執行。

只需添加(...)如下:

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

感謝您的解釋。點並檢查。 – Jamie

+0

但作爲後續;如何「看到」括號外的變量? – Jamie

+0

那麼,你可以將它們回顯給父級,並用命​​令替換捕獲它們。但是在管道後面運行的兩個腳本都是原始腳本的幾乎完全相同的副本,那麼爲什麼不把腳本的其餘部分放在parens中呢?我想你也可以調用一個shell程序來執行剩餘的功能。該程序可以定義在父親的外面。 (也就是在子shell外部。) – DigitalRoss

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

也將工作

+0

很好,但只有bash的解決方案。 – DigitalRoss

+0

「很好,但只有一個bash解決方案。」 - 自從OP要求一個bash解決方案以來,這會很好。如果eckes調用bash而不是bourne,我甚至可以贊成這個。 ;-) –

+0

@DevNull:done :-) – eckes

3

使用bash,你可以使用<<<(一個 「在這裏串」,從字符串輸入重定向):

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

令人討厭,但不幸的是,我在使用bash 2.04時,在腳本中使用時,它給了我錯誤'附近的意外標記'<<<''的語法錯誤。 – Jamie

2

查看BashFAQ 024瞭解更多關於使用read以便您可以稍後訪問變量。

我最喜歡的解決方案(比唯一的bash-那些更便攜)是這裏的文檔之一:

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

感謝您的鏈接。 +1 – Jamie

+0

雖然您提供了我需要的答案,但我的主要問題的答案之前已經回答。不過謝謝。 – Jamie