bash for循环没有给出期望的结果

时间:2017-04-17 19:11:10

标签: bash for-loop

我正在尝试在当前不包含缓存插件的所有网站上安装WordPress缓存插件。我循环遍历所有cPanel用户,但在运行时得到一些奇怪的结果。一个班轮是:

for i in $(ls -I . -I .. /var/cpanel/users)  ; do 
    WPPATH=$(find /home/$i/public_html/ -type f -name wp-config.php) 
    WPPLUGINPATH="$(echo "${WPPATH//wp-config.php/wp-content/plugins/}")"
    cd $WPPLUGINPATH 
    [ -d $WPPLUGINPATH*cache* ] || \
    wp --allow-root plugin install cache-enabler --skip-plugins --skip-themes
    sleep 3
    chown -R $i: $WPPLUGINPATH
    echo $WPPLUGINPATH
done

它适用于大多数人,但获得随机点击:

/home/userC/public_html/wp-content/plugins/
Error: This does not seem to be a WordPress install.
Pass --path=`path/to/wordpress` or run `wp core download`.
chown: missing operand after ‘userA:’
Try 'chown --help' for more information.

您可以看到某些内容已关闭,因为它引用了userC的路径,但chown是关于userA的错误

它还声明没有WP安装,但如果我手动cd到该目录,我可以运行wp-cli命令并安装插件而不会出现问题。

另一个错误:

/home/userA/public_html/wp-content/plugins/
-bash: [: /home/userB/public_html/wp/wp-content/plugins/: binary operator expected
Warning: cache-enabler: Plugin already installed.
Success: Plugin already installed.

非常感谢任何帮助

2 个答案:

答案 0 :(得分:3)

错误-bash: [: /home/userB/public_html/wp/wp-content/plugins/: binary operator expected表示路径名包含空格。

首先,不要解析ls的输出。改用glob。

其次,总是引用变量名称以避免单词拆分和无意的通配。这是您的问题的根本原因。

示例:

[ -d /path/name space/to/something.conf ]
-bash: [: /path/name: binary operator expected

您的新脚本应如下所示:

for i in /var/cpanel/users/*; do 
        WPPATH=$(find "/home/${i##*/}/public_html/" -type f -name wp-config.php)
        WPPLUGINPATH="${WPPATH%/*}/wp-content/plugins/" # Useless use of echo
        if pushd "$WPPLUGINPATH"; then
                compgen -G "${WPPLUGINPATH}*cache*" > /dev/null || wp --allow-root plugin install cache-enabler --skip-plugins --skip-themes
                sleep 3
                chown -R "${i##*/}" "$WPPLUGINPATH"
                echo "$WPPLUGINPATH"
                popd
        fi
done

正如@Charles Duffy在下面的评论中提到的,此find "/home/${i##*/}/public_html/" -type f -name wp-config.php可能会产生多个结果。使用for循环来处理每个循环。

此行[ -d "$WPPLUGINPATH"*cache* ]仅在扩展为单个路径名时才有效。请改用bash builtin compgencompgen将根据模式"${WPPLUGINPATH}*cache*"生成文件名完成。如果可以生成模式,则返回true;如果没有模式的文件,则返回false。

最后但并非最不重要的是,改变使用all-caps变量的习惯,以避免无意中覆盖环境变量。

答案 1 :(得分:0)

我最终采用了不同的方式,因为即使被@alvits改写也无法使其正常工作,但确实有所帮助,所以我想说谢谢。

我最后只收集了几个服务器的一些统计信息,将缓存插件列表放在一起并提出:

{{1}}