linux - 为文件的每一行运行脚本

标签 linux bash shell while-loop

我正在创建一个小脚本来在节点内的所有 OpenVZ 容器上运行一些命令。

我读取了所有 OpenVZ 容器 ID,并对所有容器运行了一些命令。

在 listvz.txt 文件中我有很多 ID,该命令只在第一个上运行, 所以循环不运行...

有什么想法吗? 谢谢!

#! /bin/bash
export PATH="/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin"

cat /dev/null > listvz.txt;
ls -r1 /vz/private > listvz.txt;

cat listvz.txt | while read line; do
echo FixMySQL in ${line}
vzctl exec ${line} /etc/init.d/mysql stop;
vzctl exec ${line} /etc/init.d/mysqld stop;
vzctl exec ${line} rm -rf /var/lib/mysql/mysql.sock;
vzctl exec ${line} /etc/init.d/mysql start;
vzctl exec ${line} /etc/init.d/mysqld start;
done

运行结果:

[root@ovz ~]# sh mysql-check.sh
FixMySQL in 2168
/bin/bash: /etc/init.d/mysql: No such file or directory
/bin/bash: /etc/init.d/mysqld: No such file or directory
/bin/bash: /etc/init.d/mysql: No such file or directory
/bin/bash: /etc/init.d/mysqld: No such file or directory
[root@ovz1 ~]#

只运行在CTID 2168上,但是TXT文件上的CTID多了很多...

已修复!

cat listvz.txt | while read line; do
echo FixMySQL in ${line} </dev/null
vzctl exec ${line} /etc/init.d/mysqld stop </dev/null
vzctl exec ${line} rm -rf /var/lib/mysql/mysql.sock </dev/null
vzctl exec ${line} /etc/init.d/mysqld start </dev/null
done

最佳答案

Shell 中的以下代码可以为文件的每一行运行脚本

while IFS='' read -r line || [[ -n "$line" ]]; do
   #your code
done < "input_file"

关于linux - 为文件的每一行运行脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21852185/

相关文章:

linux - bash中的德语到英语 float 系统

linux - 删除指定文件夹及其内容以外的文件夹内容

xml - 使用 Shell 脚本将 XML 文件的标签存储在数组中

git - 如何可靠地检查文件是否被 git 忽略?

bash - 填充的 printf 格式字符串没有使用多字节字符添加足够的填充

bash - 重用或重复管道输入作为命令中的参数(给出的示例)

linux - x86_64 上的影子堆栈实现

linux - 编译 Enlightenment 基础库 1.8.5 时出现问题

linux - Bash/SH,相同的命令不同的输出?

bash - SAR 命令输入多个文件