既然你擁有了它標記Linux
和Shell
我相信你想有一個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'
如果這不是你正在尋找的東西,他們我很困惑,請刪除一行以及所需的任何附加信息。
您的解決方案不會給出預期的輸出..只是複製/粘貼你的代碼和輸出是:'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
在頂部添加'set -f'。 (要禁用路徑名擴展) –
請將其添加到您的示例..我得到一個錯誤 – clarkk