這個例子已經運行在2017年6月初的Raspbian Jessie 2017-04-10版的Raspberry Pi 3上.Bash的版本是4.3.30(1)。爲什麼bash數組的一部分作爲命令執行?
在最近嘗試使用一些代碼時,我發現正在執行bash數組的內容。幸運的是,它們並不危險!
這裏有一個簡單的函數:
#!/bin/bash
echo "y.sh starting"
echo "parameter string is <[email protected]>"
args=([email protected])
echo "args array is <${args[@]}>"
echo "args array length is ${#args[@]}"
echo "y.sh ending"
,這裏是輸出
[email protected]:~ $ ./y.sh
y.sh starting
parameter string is <>
args array is <>
args array length is 0
y.sh ending
[email protected]:~ $ ./y.sh ls
y.sh starting
parameter string is <ls>
args array is <ls>
args array length is 1
y.sh ending
無意外上方這裏。
添加Y *參數之後,ls命令輸出出現在陣列中:
[email protected]:~ $ ./y.sh ls y*
y.sh starting
parameter string is <ls y01.sh y02.sh y03.sh y04a.sh y04.sh y.sh ytq>
args array is <ls y01.sh y02.sh y03.sh y04a.sh y04.sh y.sh ytq>
args array length is 8
y.sh ending
但被添加時-La,沒有的額外信息
[email protected]:~ $ ./y.sh ls -la y*
y.sh starting
parameter string is <ls -la y01.sh y02.sh y03.sh y04a.sh y04.sh y.sh ytq>
args array is <ls -la y01.sh y02.sh y03.sh y04a.sh y04.sh y.sh ytq>
args array length is 9
y.sh ending
符號如果有人能夠解釋爲什麼命令正在執行以及可以進行哪些更改以使其不會執行,這將非常有幫助。爲什麼ls的「長」輸出沒有產生,這也是一個解釋。
感謝柴郡貓的家鄉。
謝謝。我嘗試使用@ runlevel0在這裏設置的方法https://stackoverflow.com/questions/12711786/bash-convert-command-line-arguments-into-array,並意識到問題發生之前,功能開始工作參數列表。這指向我http://www.tldp.org/LDP/abs/html/globbingref.html,它擴展了你的解釋。情況經常如此,根本原因並不是人們所期望的! – user8150417
由於問題出現在函數外部,所以它不能被函數內部的任何東西修復。 @TaxpayerZombies對這個問題的迴應https://ksearch.wordpress。com/2010/09/23/wildcard-expansion-bash-shell /指向正確的方向 - 設置簡要禁用通配符的別名。 'alias y ='set -o noglob; yy'; yy(){〜/ y.sh「$ @」; set + o noglob;}' – user8150417