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

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

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

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

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

也就是說,傳遞給shell腳本的參數(shù)帶有空格時可以使用方法一和方法三。
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Linux shell實現(xiàn)每天定時備份mysql數(shù)據(jù)庫
這篇文章主要介紹了Linux shell實現(xiàn)每天定時備份mysql數(shù)據(jù)庫的代碼,分享給大家,希望大家能夠喜歡。2015-03-03
使用Systemctl列出Linux中所有服務(wù)的操作步驟
在 Linux 系統(tǒng)中,Systemctl 是一個強大的工具,用于管理系統(tǒng)的服務(wù)和守護進程,它可以讓用戶輕松地啟動、停止、重啟以及管理各種系統(tǒng)服務(wù),本文將詳細(xì)介紹如何使用 Systemctl 來列出 Linux 中的所有服務(wù),需要的朋友可以參考下2024-05-05
Bash 腳本實現(xiàn)每次登錄到 Shell 時可以查看 Linux 系統(tǒng)信息
這篇文章主要介紹了Bash 腳本實現(xiàn)每次登錄到 Shell 時可以查看 Linux 系統(tǒng)信息,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友參考下吧2019-12-12

