shell For循环奇怪问题

hujrc8aj  于 2023-02-05  发布在  Shell
关注(0)|答案(1)|浏览(104)

请看下面的输出,它看起来像第一行是不工作的第一个文件只-但对其他人,有什么想法?

#!/bin/sh

cpuser=$1
cd "/home/$cpuser/public_html"

wpconfigs=($(find . -name "wp-config.php"))
for i in "${wpconfigs[@]}";

do
cpuser=$cpuser
wpdb=$(grep -e "DB_NAME" $i | cut -d \' -f 4)
wpuser=$(grep -e "DB_USER" $i | cut -d \' -f 4)
wppass=$(grep -e "DB_PASS" $i | cut -d \' -f 4)

set -x uapi --output=jsonpretty --user="$cpuser" Mysql create_user name="${wpuser}" password="${wppass}";
sleep 2s;
set -x uapi --output=jsonpretty --user="$cpuser" Mysql set_privileges_on_database user="${wpuser}" database="${wpdb}" privileges="ALL PRIVILEGES";
sleep 2s;
set -x uapi --output=jsonpretty --user="$cpuser" Mysql set_password user="${wpuser}" password="${wppass}";
sleep 2s;
done

当我查看运行set-x进行调试的输出时,我看到以下内容;

[root@cpanel201 ~]# sh ./testing.sh qv5goe35p3783sz8
+ sleep 2s
+ set -x uapi --output=jsonpretty --user=qv5goe35p3783sz8 Mysql set_privileges_on_database 'user=qv5goe35p3783sz8_yscr_bbS$L5' database=qv5goe35p3783sz8_blog 'privileges=ALLPRIVILEGES'
+ sleep 2s
+ set -x uapi --output=jsonpretty --user=qv5goe35p3783sz8 Mysql set_password 'user=qv5goe35p3783sz8_yscr_bbS$L5' password=FhtH6UztIuoS0_
+ sleep 2s
+ for i in "${wpconfigs[@]}"
+ cpuser=qv5goe35p3783sz8
++ grep -e DB_NAME ./wordpress/wp-config.php
++ cut -d \' -f 4
+ wpdb=qv5goe35p3783sz8_wordpress
++ grep -e DB_USER ./wordpress/wp-config.php
++ cut -d \' -f 4
+ wpuser=qv5goe35p3783sz8_yscr_bb5X8h
++ grep -e DB_PASS ./wordpress/wp-config.php
++ cut -d \' -f 4
+ wppass=X7lyC17Td8tH3cm
+ set -x uapi --output=jsonpretty --user=qv5goe35p3783sz8 Mysql create_user name=qv5goe35p3783sz8_yscr_bb5X8h password=X7lyC17Td8tH3cm
+ sleep 2s
+ set -x uapi --output=jsonpretty --user=qv5goe35p3783sz8 Mysql set_privileges_on_database user=qv5goe35p3783sz8_yscr_bb5X8h database=qv5goe35p3783sz8_wordpress 'privileges=ALL PRIVILEGES'
+ sleep 2s
+ set -x uapi --output=jsonpretty --user=qv5goe35p3783sz8 Mysql set_password user=qv5goe35p3783sz8_yscr_bb5X8h password=X7lyC17Td8tH3cm
+ sleep 2s
+ for i in "${wpconfigs[@]}"
+ cpuser=qv5goe35p3783sz8
++ grep -e DB_NAME ./newsite/wp-config.php
++ cut -d \' -f 4
+ wpdb=qv5goe35p3783sz8_newsite
++ grep -e DB_USER ./newsite/wp-config.php
++ cut -d \' -f 4
+ wpuser=qv5goe35p3783sz8_yscr_bbxQiN
++ grep -e DB_PASS ./newsite/wp-config.php
++ cut -d \' -f 4
+ wppass=XpMa4v5z54tcM
+ set -x uapi --output=jsonpretty --user=qv5goe35p3783sz8 Mysql create_user name=qv5goe35p3783sz8_yscr_bbxQiN password=XpMa4v5z54tcM
+ sleep 2s
+ set -x uapi --output=jsonpretty --user=qv5goe35p3783sz8 Mysql set_privileges_on_database user=qv5goe35p3783sz8_yscr_bbxQiN database=qv5goe35p3783sz8_newsite 'privileges=ALL PRIVILEGES'
+ sleep 2s
+ set -x uapi --output=jsonpretty --user=qv5goe35p3783sz8 Mysql set_password user=qv5goe35p3783sz8_yscr_bbxQiN password=XpMa4v5z54tcM
+ sleep 2s

如果查看第二+第三组文件的输出,您将看到三个uapi命令,然而,对于第一组文件,我们只看到两个输出,没有看到它在顶部文件上执行greps的输出。
作为参考,cpuser是在命令行上设置的(sh ./www.example.com后面的值)testing.sh)
我还注意到,在顶部文件中,用户似乎被's包围,而其他两个没有。
为了清楚说明脚本在这里的作用;

  • 抓取任何wp配置以获取sql数据库名称、数据库用户和数据库密码
  • 将用户名和密码传递给cpanel api以在cPanel示例中创建用户

在本例中,该操作对配置文件2和3有效,但对初始配置文件无效-您将看到第一个create_user即使在集合-x中也丢失了

**

更新
查看了日志后,我认为这可能是因为第一个日志中的用户有一个$-这是为什么吗?我注意到只有在这个日志中,命令在''s中被引用,这对uapi来说是不正确的。如果这是原因,我该如何解决呢?
'用户= qv5goe35p3783sz8_yscr_bbS$L5'
如何转义$,因为我认为这是导致本例中出现问题的原因-所有其他字符都可以,只有在用户名中包含$时才会出现此问题

ruyhziif

ruyhziif1#

下面的代码说明了一切:

$ set -x ls
$ ls
+ ls
a.out

据我所知,在所有的shell中,“set -x”后面的“ls”都被忽略了。到了下一个“$ ls”和“+ ls”,你可以看到“set -x”被执行了。
通常的做法是,也可能是您想要的,即:

$ set -x 
$ ls
+ ls
a.out   
$ set -
+ set -

或者作为一个行程序:

$ set -x ; ls ; set -
+ ls
a.out
+ set -

通过前面的代码,您还可以看到为什么输出中缺少行'set -x'只是为下一个命令启用shell跟踪,而'set -'也为下一个命令结束了它。

相关问题