解決linux?shell中傳遞包含空格的參數(shù)問題
linux shell中傳遞包含空格的參數(shù)
昨天一同事遇到一個(gè)問題,往函數(shù)中傳遞的一個(gè)參數(shù)是一個(gè)sql語句時(shí),函數(shù)里只取了這個(gè)sql的第一個(gè)單詞,
他的寫法大概類似這樣:
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可以看到函數(shù)中只取了該參數(shù)的第一個(gè)單詞。

這是因?yàn)楹瘮?shù)的參數(shù)傳遞使用的是位置參數(shù),且默認(rèn)就是空格來間隔各個(gè)位置上的參數(shù),所以他這種寫法第二個(gè)參數(shù)的值就成了"where" 。
下面總結(jié)一下我想到的解決辦法:
一、傳遞給函數(shù)的某個(gè)參數(shù)含有空格
1.傳遞的帶空格的參數(shù)是最后一個(gè)參數(shù)
這種情況解決辦法比較多,下面分別總結(jié)下:
方法一:
傳遞參數(shù)時(shí)將帶上引號(hào),引號(hào)內(nèi)的所有內(nèi)容都將作為一個(gè)參數(shù),如果該參數(shù)中沒有變量,單引號(hào)雙引號(hào)都可以;有變量的話就用雙引號(hào)。
test_param()
{
p1=$1
p2=$2
echo "p2:"$p2
}
#第二個(gè)參數(shù)傳遞參數(shù)時(shí)帶上引號(hào)
where_condition=`echo "where a=b;"`
echo "where_condition:"$where_condition
test_param a "$where_condition"測(cè)試結(jié)果:

方法二:
不使用該參數(shù),而是將其對(duì)應(yīng)的變量直接在函數(shù)中使用
test_param()
{
p1=$1
p2=$where_condition
echo "p2:"$p2
}
#調(diào)用函數(shù)時(shí)不傳遞該參數(shù),而是直接在函數(shù)中使用變量
where_condition=`echo "where a=b;"`
echo "where_condition:"$where_condition
test_param a 方法三:
使用$*或者$@傳遞該參數(shù),會(huì)以一個(gè)單字符串顯示所有傳遞的參數(shù)。
不同之處在于$*會(huì)把所有包含的位置參數(shù)當(dāng)成一個(gè)整體,而$@會(huì)把所有位置參數(shù)當(dāng)成單獨(dú)的字段(相當(dāng)于一個(gè)列表)。
本例中它們的用法一樣。
test_param()
{
p1=$1
#取第二個(gè)位置參數(shù)到最后的所有內(nèi)容
p2=`echo ${@:2}`
echo "p2:"$p2
}
where_condition="where a=b;"
echo "where_condition:"$where_condition
test_param a $where_conditiontest_param()
{
p1=$1
#取第二個(gè)位置參數(shù)到最后的所有內(nèi)容
p2=${*:2}
echo "p2:"$p2
}
where_condition="where a=b;"
echo "where_condition:"$where_condition
test_param a $where_condition以上代碼的測(cè)試結(jié)果都是一樣的,就不一一列出來了。
2.傳遞的帶空格的參數(shù)不是最后一個(gè)參數(shù)
當(dāng)該參數(shù)不是最后一個(gè)參數(shù)時(shí),方法一跟方法二無需更改,方法三則需要明確知道該參數(shù)中含有幾個(gè)空格才能正確使用,不然則不適用。
比如,如果是第二個(gè)參數(shù),該參數(shù)中含有兩個(gè)空格可以寫成:${@:2:3}。
二、傳遞給shell腳本的參數(shù)帶有空格
我們來簡(jiǎn)單模擬一下這種情況。
p1=$1 p2=$2 echo "p2:"$p2
調(diào)用時(shí)如果直接傳也是只能取到該參數(shù)的第一個(gè)單詞。

使用方法一加上引號(hào)試試,參數(shù)獲取正確:

因?yàn)槭悄_本調(diào)用,沒辦法使用第二種方式傳遞變量。
試一下第三種方法:
p1=$1
p2=${*:2}
echo "p2:"$p2雖然沒有加引號(hào),仍然可以正常使用。

也就是說,傳遞給shell腳本的參數(shù)帶有空格時(shí)可以使用方法一和方法三。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Shell腳本實(shí)現(xiàn)自動(dòng)安裝zookeeper
這篇文章主要介紹了Shell腳本實(shí)現(xiàn)自動(dòng)安裝zookeeper,本文直接給出實(shí)現(xiàn)代碼,需要的朋友可以參考下2015-01-01
一天一個(gè)shell命令 linux文本操作系列-tac,rev命令詳解
這篇文章主要介紹了一天一個(gè)shell命令 linux文本操作系列-tac,rev命令詳解,需要的朋友可以參考下2016-06-06
Shell實(shí)現(xiàn)強(qiáng)制釋放內(nèi)存腳本分享
這篇文章主要介紹了Shell實(shí)現(xiàn)強(qiáng)制釋放內(nèi)存腳本分享,本文直接給出實(shí)現(xiàn)代碼,并對(duì)每一句代碼都做了講解了,需要的朋友可以參考下2015-02-02
利用shell刪除數(shù)據(jù)表中指定信息和字段對(duì)應(yīng)的文件
這篇文章主要介紹了利用shell刪除數(shù)據(jù)表中指定信息和字段對(duì)應(yīng)的文件,需要的朋友可以參考下2014-04-04

