2012-07-03 73 views
1

我目前有一個bash腳本。它看起來像這樣:Bash:將變量傳遞給具有空格的腳本

#!/bin/bash 

case "$1" in 
    sendcommand) 
     do X with $2 
     exit 
     ;; 
esac 

我將如何發送的所有命令this command with spaces到$ 2無command作爲$ 3 with爲$ 4等?有沒有像PHP或Javascript的encodeURI bash?

回答

6

您也可以打電話給你的腳本在引號第二個參數也

./scriptname sendcommand "command with spaces" 

您的腳本應該是這樣的

#!/bin/bash 

case "$1" in 
    sendcommand) 
     something "$2" 
     exit 
     ;; 
esac 
2

它括在雙引號:

do_X_with "$2" 

雙引號保留在可變的內部間距,包括換行,如果他們是在第一位置的值。的確,理解"[email protected]""$*"的雙引號的用法也很重要,更不用說使用bash陣列的時候了。

因爲shell在其循環結構中使用do作爲關鍵字,所以不能輕鬆地使用名爲do的命令。要調用它,你必須指定一個命令的路徑,例如./do$HOME/bin/do


但是$ 2是「本」和OP希望它是「這個命令用空格」。

好的。我們需要查看命令行調用和期望的行爲。假設正在執行的腳本被稱爲script。此外,正在執行的該命令是othercommand(不能使用command;這是一個標準命令)。

可能的調用包括:

  • script sendcommand "this command with spaces"
  • script sendcommand 'this command with spaces'
  • script sendcommand this command with spaces

單引號和雙引號調用是在本例中等價的。如果在參數列表中存在要擴展的變量或要調用的命令,它們將不相等。

它可以編寫script處理所有三種情況:

#!/bin/bash 

case "$1" in 
    sendcommand) 
     shift 
     othercommand "$*" 
     exit 
     ;; 
esac 

假設調用包圍論點報價。 shift命令從參數列表中刪除$1,並將其餘(單個)參數重新編號爲$1。然後它調用othercommand,其中一個字符串參數由連接在一起的參數內容組成。如果有多個參數,則內容將由一個「空格」($IFS的第一個字符)分隔。

假設調用沒有將引數括在引號中。 shift命令仍然從參數列表中刪除$1sendcommand),然後空格將剩餘的參數分隔爲單個參數。

在所有這三種情況下,othercommand都會看到一個由"this command with spaces"組成的參數(當然程序沒有看到雙引號)。

+0

但是'$ 2'是「this」,OP希望它是「帶空格的這個命令」。我認爲「做」是一個佔位符。 –

2

你可以只使用雙引號:

do X with "$2" 
+0

但是'$ 2'是「this」,OP希望它是「帶空格的這個命令」。 –