2017-04-24 41 views
0

如何循環/通過串迭代迭代通過與路徑連接字符串 - 防止通配符

exclude_args='' 
exclude='/var/www/bak/*/* /var/test' 
set -- "$exclude" 
shift 
for path; do 
    exclude_args="$exclude_args --exclude '$path'" 
done 
echo "$exclude_args" 

輸出

--exclude '/var/www/bak/*/* /var/test' 

如何獲得這樣

--exclude '/var/www/bak/*/*' --exclude '/var/test' 

回答

0

既然你擁有了它標記LinuxShell我相信你想有一個POSIX外殼的解決方案。你可以做同樣的事情,允許正常的分詞使用printf,正如Heemayl在他的回答中正確表明的那樣,但沒有數組。首先,如果你的系統允許您使用set -f防止路徑擴展,使用方法:

#!/bin/sh 
set -f 
exclude_args="" 
exclude='/var/www/bak/*/* /var/test' 
printf " --exclude '%s'" $exclude 
printf "\n" 

如果您不能使用set -f不管什麼原因,你將需要包裝用單引號每個部件,以防止膨脹,可強制執行這與sed

#!/bin/sh 
exclude_args='' 
exclude='/var/www/bak/*/* /var/test' 
exclude="$(echo "$exclude" | sed -e "s/[ ]/' '/g" -e "s/\(^.*$\)/'\1'/")" 
printf " --exclude %s" $exclude 
printf "\n" 

注:$exclude沒有引用作爲參數printf是故意的。

如果你想捕捉到exclude_args變量輸出,(和你的系統提供printf-v選項,你可以簡單地使用printf -v形式,例如

#!/bin/sh 
exclude_args='' 
exclude='/var/www/bak/*/* /var/test' 
exclude="$(echo "$exclude" | sed -e "s/[ ]/' '/g" -e "s/\(^.*$\)/'\1'/")" 
printf -v exclude_args " --exclude %s" $exclude 
echo "$exclude_args" 

示例使用/輸出

$ sh exargs.sh 
--exclude '/var/www/bak/*/*' --exclude '/var/test' 

如果這不是你正在尋找的東西,他們我很困惑,請刪除一行以及所需的任何附加信息。

+0

您的解決方案不會給出預期的輸出..只是複製/粘貼你的代碼和輸出是:'sh test.sh --exclude'/ var/www/bak/site/ini'--exclude'/ var/www/bak/site2/db'--exclude'/ var/www/bak/site2/ini'--exclude'/ var/www/bak/site2/site'--exclude'/ var/www/bak/site3/ini'' – clarkk

+0

在頂部添加'set -f'。 (要禁用路徑名擴展) –

+0

請將其添加到您的示例..我得到一個錯誤 – clarkk

0

你是一個輸出遵循相當偏斜的道路。利用陣列和printf

exclude=('/var/www/bak/*/*' '/var/test') 
printf -- '--exclude %s ' "${exclude[@]}" 
  • exclude=('/var/www/bak/*/*' '/var/test')把所需的內容作爲陣列的元件exclude

  • printf -- '--exclude %s ' "${exclude[@]}"打印數組元素與琴絃--exclude在前面

要在最後得到一個換行符,添加一個echo

printf ...; echo 

例子:

$ exclude=('/var/www/bak/*/*' '/var/test') 

$ printf -- '--exclude %s ' "${exclude[@]}"; echo 
--exclude /var/www/bak/*/* --exclude /var/test 
+0

'exclude'是一個函數參數..你如何將字符串'/ var/www/bak/*/*/var/test'轉換爲'exclude =('/ var/www/bak/*/* ''/ var/test')'? – clarkk

+0

@clarkk在函數內執行'exclude =($ @)',所有的位置參數都會被'IFS'分割併成爲數組元素... – heemayl

+0

你不明白..它的passd作爲一個連接字符串..這些路徑不是唯一的參數 – clarkk