echo(echo“please wait,$ i”)>> bash中的cmds.txt

时间:2017-06-10 06:35:13

标签: bash

我正在处理一个bash脚本,它在其中创建一个文本文件,其中包含一些我将用于运行的命令。 在命令之间我想要发送一个echo消息发送到文本文件,如何实现这个?

c=0;
for i in `cat`; do
echo "bash stopservers.sh $i" >> cmds.txt;
echo  (echo "please wait, stopping Managed server $i") >> cmds.txt
echo "sleep  10" >>cmds.txt
c=$((c+1));
done <  list.txt

由于

3 个答案:

答案 0 :(得分:2)

首先,使用while循环而不是for循环来确保准确处理每一行。

使用printf简化了引用; %q格式确保$line被正确引用以在命令行中使用。

您可以将整个循环重定向到cmds.txt,而不是在正文中逐行进行。

c=0
while IFS= read -r line; do
  printf 'bash stopservers.sh %q\n' "$line"
  printf 'printf %q %q\n' '%s\n' "Please wait, stopping managed server $line"
  printf 'sleep 10\n'
  c=$((c+1))
done < list.txt >> cmds.txt

答案 1 :(得分:-1)

bashbash生成sh代码很难。

  • 如果您要从bash生成bash代码,则可以按以下方式使用printf %q

    while IFS= read -r line; do
        printf 'bash stopservers.sh %q\n' "$line"
        printf 'printf %q %q\n' '%s\n' "Please wait, stopping managed server $line"
        printf 'sleep 10\n'
    done <servers_list.txt >cmds.txt
    
  • 如果您要从bash生成sh代码,则可以使用以下代码:

    q() {
        prefix=''
        for p in "$@" ; do
            printf "$prefix"\'
            printf %s "$p" | sed "s/'/'\\\\''/g"
            printf \'
            prefix=' '
        done
    }
    
    while IFS= read -r line; do
        printf '%s\n' "$(q bash stopservers.sh "$line"                                )"
        printf '%s\n' "$(q printf '%s\n' "Please wait, stopping managed server $line" )"
        printf '%s\n' "$(q sleep 10                                                   )"
    done <servers_list.txt >cmds.txt
    

在某些情况下,$i可以包含的内容没有限制;该值将被正确转义。

答案 2 :(得分:-3)

将您的echo (echo "please wait, stopping Managed server $i") >> cmds.txt语句替换为

echo 'echo "please wait, stopping Managed server '$i'"' >> cmds.txt