Bash - 将错误的值传递给函数

时间:2017-05-25 13:10:59

标签: bash shell

因此,编写一个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日志所在的路径,因为它们可以位于不同设置的多个位置。

2 个答案:

答案 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"

作为一般规则,除非有特殊原因,否则应始终引用变量,因为您希望对结果进行分词和通配符扩展。