2017-08-26 53 views
0

我已經閱讀了How do you tell if a string contains another string in Unix shell scripting?,但我正在努力讓我的代碼以此爲例工作。字符串測試中的子串在unix shell中產生空變量用於測試

我在默認的FreeBSD shell/bin/sh中這樣做。請不要bash回答。

這裏是我的代碼

while 
 
     : ${start=$i} 
 
     var1="$(command | awk -v awk_i=$i 'NR==awk_i { print $1 }')" 
 
       if test ${var1#*$var2} = $var2 
 
       then 
 
         row=$i 
 
         break 
 
       fi 
 
     i="$(($i+1))" 
 
     [ "$i" -lt $iterate ] 
 
do :; 
 
done

我知道,因爲測試失敗並繼續通過一系列直到結束迭代是Var1爲工作正常。問題是,當測試通過時,var1的變量是空的。

這裏有一些調試輸出,我們有迭代發生,找到正確的var2值並在理論上通過測試,然後因爲變量沒有被正確表示爲測試的一部分,所以它繼續前進。

+ awk -v 'awk_i=27' 'NR==awk_i { print $1 }' 
 
+ var1=file/path/variable 
 
+ test file/path/variable '=' var2 
 
+ i=28 
 
+ [ 28 -lt 52 ] 
 
+ : 
 
+ : 2 
 
+ command 
 
+ awk -v 'awk_i=28' 'NR==awk_i { print $1 }' 
 
+ var1=file/path/variable 
 
+ test '=' var2 
 
test: =: unexpected operator 
 
+ i=29 
 
+ [ 29 -lt 52 ] 
 
+ : 
 
+ : 2 
 
+ command 
 
+ awk -v 'awk_i=29' 'NR==awk_i { print $1 }' 
 
+ var1=file/path/variable 
 
+ test file/path/variable '=' var2 
 
+ i=30 
 
+ [ 30 -lt 52 ]

我甚至試過這種替代方法: ##*/ use in UNIX Shell Scripting

if ${var1##*/$var2} = $var2

任何人都可以做任何建議,爲什麼變量是結束了空白,因此測試失敗正確的條目?它可能會造成嚴重破壞嗎? (雖然其他的輸出都很好,似乎)

感謝

+0

你究竟想做什麼,你的意見是什麼?在FreeBSD中,默認情況下你有[csh](https://www.freebsd.org/cgi/man.cgi?csh(1))。 – nbari

+0

@nbari 我正在尋找遍歷zfs數據集尋找各種不同的東西。 當它發現getopts正在尋找的數據集非常具體時,它似乎失敗了。 – Madtempest

+0

'dataset_name = 「$(ZFS名單| awk的-v awk_i = $ I 'NR == awk_i {$打印1}')」 如果$ {dataset_name#* $}集= $數據集 然後 行= $ I 打破' 這有幫助嗎? – Madtempest

回答

0

也許這樣的事情可能會有所幫助:

#!/bin/sh 

zfs list | while read -r line; do 
     var1=$(echo $line | awk '{print $1'}) 
     echo ${var1} 
     # your logic here 
     # ... 
done 

在此基礎腳本,而不是調用多次的每次互動命令zfs list( )只使用一次,輸出後者用於形成/創建變量和自定義條件。

+0

謝謝。我會給它一個去看看讓你知道它是怎麼回事! – Madtempest

+0

'zfs list |同時讀取-r行;做 \t dataset_name = $(回聲$線| awk的 '{打印$ 1'}) 如果$ {dataset_name#* $數據集} = $數據集 然後 回聲$ {dataset_name} 休息 網絡 done' Unforunately這仍然因爲完全相同的原因而失敗。就好像我需要將$ dataset設置爲「」或其他東西才能起作用。 – Madtempest

+0

定義數據集= 0有什麼問題?其次,你只是想檢查dataset_name是否以X bar結尾?例如'zroot/var/tmp'檢查是否以'tmp'結尾? – nbari