1. 程式人生 > 其它 >解決linux shell中引數傳遞包含空格時只會取第一個空格前的字串的問題

解決linux shell中引數傳遞包含空格時只會取第一個空格前的字串的問題

技術標籤:linuxshelllinux後端

目錄

一、傳遞給函式的某個引數含有空格

1.傳遞的帶空格的引數是最後一個引數

2.傳遞的帶空格的引數不是最後一個引數

二、傳遞給shell指令碼的引數帶有空格


昨天一同事遇到一個問題,往函式中傳遞的一個引數是一個sql語句時,函式裡只取了這個sql的第一個單詞,他的寫法大概類似這樣:

test_param()
{
p1=$1
p2=$2
echo "p2:"$p2
}

where_condition=`echo "where a=b;"`
echo "where_condition:"$where_condition
test_param a $where_condition
 

可以看到函式中只取了該引數的第一個單詞。

這是因為函式的引數傳遞使用的是位置引數,且預設就是空格來間隔各個位置上的引數,所以他這種寫法第二個引數的值就成了"where"。下面總結一下我想到的解決辦法:

一、傳遞給函式的某個引數含有空格

1.傳遞的帶空格的引數是最後一個引數

這種情況解決辦法比較多,下面分別總結下:

方法一:傳遞引數時將帶上引號,引號內的所有內容都將作為一個引數,如果該引數中沒有變數,單引號雙引號都可以;有變數的話就用雙引號。

test_param()
{
p1=$1
p2=$2
echo "p2:"$p2
}

#第二個引數傳遞引數時帶上引號
where_condition=`echo "where a=b;"`
echo "where_condition:"$where_condition
test_param a "$where_condition"

測試結果:

方法二:不使用該引數,而是將其對應的變數直接在函式中使用

test_param()
{
p1=$1
p2=$where_condition
echo "p2:"$p2
}

#呼叫函式時不傳遞該引數,而是直接在函式中使用變數
where_condition=`echo "where a=b;"`
echo "where_condition:"$where_condition
test_param a 

方法三:使用$*或者[email protected]傳遞該引數,會以一個單字串顯示所有傳遞的引數。不同之處在於$*會把所有包含的位置引數當成一個整體,而

[email protected]會把所有位置引數當成單獨的欄位(相當於一個列表)。本例中它們的用法一樣。

test_param()
{
p1=$1
#取第二個位置引數到最後的所有內容
p2=`echo ${@:2}`
echo "p2:"$p2
}

where_condition="where a=b;"
echo "where_condition:"$where_condition
test_param a $where_condition
test_param()
{
p1=$1
#取第二個位置引數到最後的所有內容
p2=${*:2}
echo "p2:"$p2
}

where_condition="where a=b;"
echo "where_condition:"$where_condition
test_param a $where_condition

以上程式碼的測試結果都是一樣的,就不一一列出來了。

2.傳遞的帶空格的引數不是最後一個引數

當該引數不是最後一個引數時,方法一跟方法二無需更改,方法三則需要明確知道該引數中含有幾個空格才能正確使用,不然則不適用。比如,如果是第二個引數,該引數中含有兩個空格可以寫成:${@:2:3}。

二、傳遞給shell指令碼的引數帶有空格

我們來簡單模擬一下這種情況。

p1=$1
p2=$2
echo "p2:"$p2

呼叫時如果直接傳也是隻能取到該引數的第一個單詞。

使用方法一加上引號試試,引數獲取正確:

因為是指令碼呼叫,沒辦法使用第二種方式傳遞變數。

試一下第三種方法:

p1=$1
p2=${*:2}
echo "p2:"$p2

雖然沒有加引號,仍然可以正常使用。

也就是說,傳遞給shell指令碼的引數帶有空格時可以使用方法一和方法三。

大家還有更好的方法嗎?歡迎一起交流探討❥(^_-)