解決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í)將帶上引號,引號內(nèi)的所有內(nèi)容都將作為一個(gè)參數(shù),如果該參數(shù)中沒有變量,單引號雙引號都可以;有變量的話就用雙引號。
test_param() { p1=$1 p2=$2 echo "p2:"$p2 } #第二個(gè)參數(shù)傳遞參數(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ù),而是直接在函數(shù)中使用變量 where_condition=`echo "where a=b;"` echo "where_condition:"$where_condition test_param a
方法三:
使用$*或者$@傳遞該參數(shù),會以一個(gè)單字符串顯示所有傳遞的參數(shù)。
不同之處在于$*會把所有包含的位置參數(shù)當(dāng)成一個(gè)整體,而$@會把所有位置參數(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_condition
test_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
以上代碼的測試結(jié)果都是一樣的,就不一一列出來了。
2.傳遞的帶空格的參數(shù)不是最后一個(gè)參數(shù)
當(dāng)該參數(shù)不是最后一個(gè)參數(shù)時(shí),方法一跟方法二無需更改,方法三則需要明確知道該參數(shù)中含有幾個(gè)空格才能正確使用,不然則不適用。
比如,如果是第二個(gè)參數(shù),該參數(shù)中含有兩個(gè)空格可以寫成:${@:2:3}。
二、傳遞給shell腳本的參數(shù)帶有空格
我們來簡單模擬一下這種情況。
p1=$1 p2=$2 echo "p2:"$p2
調(diào)用時(shí)如果直接傳也是只能取到該參數(shù)的第一個(gè)單詞。
使用方法一加上引號試試,參數(shù)獲取正確:
因?yàn)槭悄_本調(diào)用,沒辦法使用第二種方式傳遞變量。
試一下第三種方法:
p1=$1 p2=${*:2} echo "p2:"$p2
雖然沒有加引號,仍然可以正常使用。
也就是說,傳遞給shell腳本的參數(shù)帶有空格時(shí)可以使用方法一和方法三。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
用shell腳本自己一個(gè)秒級定時(shí)任務(wù)
這篇文章主要為大家詳細(xì)介紹了如何使用Shell腳本實(shí)現(xiàn)一個(gè)定時(shí)任務(wù)管理工具,可以每秒執(zhí)行一次,并保證任務(wù)異步、非阻塞執(zhí)行,需要的可以參考下2024-12-12Linux shell實(shí)現(xiàn)每天定時(shí)備份mysql數(shù)據(jù)庫
這篇文章主要介紹了Linux shell實(shí)現(xiàn)每天定時(shí)備份mysql數(shù)據(jù)庫的代碼,分享給大家,希望大家能夠喜歡。2015-03-03使用Systemctl列出Linux中所有服務(wù)的操作步驟
在 Linux 系統(tǒng)中,Systemctl 是一個(gè)強(qiáng)大的工具,用于管理系統(tǒng)的服務(wù)和守護(hù)進(jìn)程,它可以讓用戶輕松地啟動、停止、重啟以及管理各種系統(tǒng)服務(wù),本文將詳細(xì)介紹如何使用 Systemctl 來列出 Linux 中的所有服務(wù),需要的朋友可以參考下2024-05-05Bash 腳本實(shí)現(xiàn)每次登錄到 Shell 時(shí)可以查看 Linux 系統(tǒng)信息
這篇文章主要介紹了Bash 腳本實(shí)現(xiàn)每次登錄到 Shell 時(shí)可以查看 Linux 系統(tǒng)信息,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2019-12-12