shell腳本傳參中包含有空格的參數(shù)
問題描述
調用并傳參數(shù)給其他shell腳本,傳的參數(shù)帶有空格,被調用的shell腳本只取了這個參數(shù)的第一個單詞。
代碼如下
# 傳參腳本 test_pre.sh [wqf@b1i10 test]$ cat test_pre.sh binFilePath="/apps/test" logpath="/apps/test" std_time="2023-01-31 18:00:00" sh $binFilePath/test.sh $std_time > $logpath/test_$(date +%Y%m%d%H%M).log 2>&1 &? # 調用腳本 test.sh [wqf@b1i10 test]$ cat test.sh std_time=$1 echo $std_time
測試結果如下,可以看到只取了該參數(shù)的第一個單詞
[wqf@b1i10 test]$ cat test_202302061655.log
2023-01-31
原因分析
腳本的參數(shù)傳遞使用的是位置參數(shù),且默認就是空格來間隔各個位置上的參數(shù),所以只取std_time前半個部分“2023-01-31”。
解決方案
方法一:傳遞參數(shù)時將帶上引號,引號內的所有內容都將作為一個參數(shù),如果該參數(shù)中沒有變量,單引號雙引號都可以;有變量的話就用雙引號。
代碼如下
# 傳參腳本 test_pre.sh [wqf@b1i10 test]$ cat test_pre.sh binFilePath="/apps/test" logpath="/apps/test" std_time="2023-01-31 18:00:00" sh $binFilePath/test.sh "$std_time" > $logpath/test_$(date +%Y%m%d%H%M).log 2>&1 &? # 調用腳本 test.sh [wqf@b1i10 test]$ cat test.sh std_time=$1 echo $std_time
測試結果
[wqf@b1i10 test]$ cat test_202302061716.log
2023-01-31 18:00:00
方法二:使用 $* 或者 $@ 傳遞該參數(shù),會以一個單字符串顯示所有傳遞的參數(shù)。不同之外在于 $* 會把所有包含的位置參數(shù)當成一個整體,而 $@ 會把所有位置參數(shù)當成單獨的字段(相當于一個列表)。 本例中它們的用法一樣。
代碼如下
# 傳參腳本 test_pre.sh [wqf@b1i10 test]$ cat test_pre.sh binFilePath="/apps/test" logpath="/apps/test" std_time="2023-01-31 18:00:00" sh $binFilePath/test.sh $std_time > $logpath/test_$(date +%Y%m%d%H%M).log 2>&1 &? # 調用腳本 test.sh [wqf@b1i10 test]$ cat test.sh #取第一個參數(shù)到的所有內容(直到最后) std_time=${@:1} echo $std_time # 調用腳本 test.sh [wqf@b1i10 test]$ cat test.sh #取第一個參數(shù)到的所有內容(直到最后) std_time=${*:1} echo $std_time
以上代碼測試結果都是一樣的,不一一展示。
注意:假設要傳的參數(shù)中含有多個空格,需要標明含有幾個空格才能正確使用。比如,如果是第二個參數(shù),該參數(shù)中含有兩個空格可以寫成:${@:2:3}
拓展
傳遞給函數(shù)的某個參數(shù)含有空格
傳遞給函數(shù)的某個參數(shù)含有空格,除了以上兩種方法之外,還可以有方法三:直接將對應的變量在函數(shù)中使用,腳本調用,沒辦法使用這種方式傳遞變量。
假設函數(shù)腳本的代碼如下
[wqf@b1i10 ~]$cat test_1.sh test_param(){ std_time=$1 echo "std_time:" $std_time } std_time="2023-01-31 18:00:00" echo "std_time:" $std_time test_param $std_time
測試結果
[wqf@b1i10 ~]$ sh test_1.sh
std_time: 2023-01-31 18:00:00
std_time: 2023-01-31
使用方法三的代碼如下:
[wqf@b1i10 ~]$cat test_1.sh test_param(){ std_time=$std_time echo "std_time:" $std_time } std_time="2023-01-31 18:00:00" echo "std_time:" $std_time test_param?
使用方法三的測試結果:
[wqf@b1i10 ~]$ sh test_1.sh
std_time: 2023-01-31 18:00:00
std_time: 2023-01-31 18:00:00
使用方法一的代碼如下:
[wqf@b1i10 ~]$cat test_1.sh test_param(){ std_time=$1 echo "std_time:" $std_time } std_time="2023-01-31 18:00:00" echo "std_time:" $std_time test_param "$std_time"
使用方法二的代碼如下:
[wqf@b1i10 ~]$cat test_1.sh test_param(){ std_time=${@:1} echo "std_time:" $std_time } std_time="2023-01-31 18:00:00" echo "std_time:" $std_time test_param "$std_time" [wqf@b1i10 ~]$cat test_1.sh test_param(){ std_time=${*:1} echo "std_time:" $std_time } std_time="2023-01-31 18:00:00" echo "std_time:" $std_time test_param "$std_time"
以上測試結果都是一致,不一一展示。
到此這篇關于shell腳本傳參中包含有空格的參數(shù)的文章就介紹到這了,更多相關shell傳遞帶空格的參數(shù)內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
linux shell實現(xiàn)獲取用戶輸入指定范圍的單個字符的兩種方法
用shell實現(xiàn)的,要求獲取用戶輸一個字符a-zA-Z實現(xiàn)方法如下,需要的朋友可以參考下2013-03-03Shell腳本實現(xiàn)分析apache日志中ip所在的地區(qū)
這篇文章主要介紹了Shell腳本實現(xiàn)分析apache日志中ip所在的地區(qū),本文使用了一款nali工具實現(xiàn),需要的朋友可以參考下2014-12-12Linux命令每天必學之 useradd/adduser 新增用戶
Linux下useradd或adduser命令用來建立用戶帳號和創(chuàng)建用戶的起始目錄,使用權限是超級用戶。接下來通過本文給大家介紹每天必學Linux命令之 useradd/adduser 新增用戶的相關知識,需要的朋友參考下吧2018-10-10