解決linux shell中傳遞包含空格的引數

2021-10-14 04:20:41 字數 1970 閱讀 3035

目錄

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

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

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

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

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

test_param()

where_condition=`echo "where a=b;"`

echo "where_condition:"$where_condition

test_param a $where_condition

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

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

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

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

test_param()

#第二個引數傳遞引數時帶上引號

where_condition=`echo "where a=b;"`

echo "where_condition:"$where_condition

test_param a "$where_condition"

測試結果:

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

test_param()

#呼叫函式時不傳遞該引數,而是直接在函式中使用變數

where_condition=`echo "where a=b;"`

echo "where_condition:"$where_condition

test_param a

方法三:使用$*或者$@傳遞該引數,會以乙個單字串顯示所有傳遞的引數。不同之處在於$*會把所有包含的位置引數當成乙個整體,而$@會把所有位置引數當成單獨的字段(相當於乙個列表)。本例中它們的用法一樣。

test_param()

`echo "p2:"$p2

}where_condition="where a=b;"

echo "where_condition:"$where_condition

test_param a $where_condition

test_param()

echo "p2:"$p2

}where_condition="where a=b;"

echo "where_condition:"$where_condition

test_param a $where_condition

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

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

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

p1=$1

p2=$2

echo "p2:"$p2

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

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

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

試一下第三種方法:

p1=$1

p2=$

echo "p2:"$p2

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

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

linux shell 引數傳遞

在shell程式設計時.可以使用引數。shell有位置引數和內部引數 1.位置引數 由系統提供的引數稱為位置引數。位置引數的值可以用 n得到,n是乙個數字,如果為1,即 1.類似c語言中的陣列,linux會把輸入的命令字串分段並給每段進行標號,標號從0開始。第0號為程式名字,從1開始就表示傳遞給程式...

Linux shell傳遞引數

在執行 shell 指令碼時,向指令碼傳遞引數,指令碼內獲取引數的格式為 n。n 代表乙個數字,1 為執行指令碼的第乙個引數,2 為執行指令碼的第二個引數,以此類推 例項以下例項我們向指令碼傳遞三個引數,並分別輸出,其中 0 為執行的檔名 bin bash echo shell 傳遞引數例項!ech...

linux shell 傳遞引數

在執行shell指令碼時可以傳遞引數 指令碼獲取引數的格式為 0 1 2 其中 1 為傳遞的第乙個引數 而 0 接受的是.test.sh 這個東西 例 bin bash echo 1 0echo 2 1echo 3 2執行結果 注意 大家可以看到我執行時後面傳了兩個引數 11 22 但是接收時 0接...