因此,编写一个bash脚本请参阅下面的代码。
allAccessLocations=("/var/www/vhosts/*/logs/access_log" "/var/www/vhosts/*/statistics/access_log" "/var/log/httpd/access_log" "/var/log/httpd/access.log")
checkAccessPaths() {
for i in ${allAccessLocations[*]};do
let loopCount++
local count=$(ls 2>/dev/null $i | wc -l)
if (( $count > 0 ));then
local toPass=${allAccessLocations[loopCount -1]}
echo "this is what should be passed $toPass" >> $reportlog
checkApacheIPTest $toPass
else
:
fi
done
}
checkApacheIPTest(){
echo "echo $1 is what is passed" >> $reportlog
}
这是日志的以下输出。
this is what should be passed /var/www/vhosts/*/logs/access_log
echo /var/www/vhosts/website1/logs/access_log is what is passed
this is what should be passed /var/www/vhosts/*/statistics/access_log
echo /var/www/vhosts/*/statistics/access_log is what is passed
正如你所看到的那样知道将字符串作为字符串传递给下一个函数,但是当目录路径为" / var / www / vhosts / * logs / access_log被传递给下一个函数,它会自动找到它可以的第一个文件夹而变量变为那个?
我的想法是试图找出Apache日志所在的路径,因为它们可以位于不同设置的多个位置。
答案 0 :(得分:2)
使用引号和@
;
for i in "${allAccessLocations[@]}"; ...
使用不带引号的$ {allAccessLocations [*]}实际上与编写for i in /var/www/vhosts/*/logs/access_log /var/www/vhosts/*/st ...
相同,*得到了全局扩展。使用@和引号有效地扩展了数组的元素并单独引用它们,防止了glob扩展。
答案 1 :(得分:1)
您需要引用$toPass
。否则,变量中的通配符将被展开,$1
将只是第一个匹配的文件。
checkApacheIPTest "$toPass"
作为一般规则,除非有特殊原因,否则应始终引用变量,因为您希望对结果进行分词和通配符扩展。