如何在bash中使用pipe(stdin)传递值来读取变量

时间:2014-08-09 08:23:41

标签: bash pipe stdin

我读了很多关于将管道标准输入传递给bash读取函数的内容,但似乎没有什么能适用于我的bash版本!!

GNU bash,版本3.2.51(1)-release(x86_64-suse-linux-gnu)

我有一个bash脚本,在某些时候用变量CONTINUEQUESTION询问用户“是/否”:

echo "Do you want to continue? (yes/no):"
read CONTINUEQUESTION
tmp=$(tr '[:upper:]' '[:lower:]' <<<$CONTINUEQUESTION)
if [[ "$tmp" != 'y'  &&  "$tmp" != 'yes' ]]; then
                echo "Aborting because of input '$CONTINUEQUESTION'"
                exit
fi

我想在没有用户输入的情况下向这个问题输入“是或否”! 是的我知道我可以使用expect,但在这种情况下我不喜欢它。

所以我尝试了几件事:

CONTINUEQUESTION='yes'
echo $CONTINUEQUESTION | ./myscript.sh

因输入'

而中止
./myscript.sh <<< "$CONTINUEQUESTION"

因输入'

而中止

......还有很多其他的,没什么用的!?

O.k。现在我做了一点反转思考,并发现下面的行导致了管道的问题...因为当我说出来时,所有下面的答案都工作得很好,但是当执行这一行时没有:

running=`ssh root@${HOSTNAME} 'su - root -c "/bin/tools list | grep \"system running\"" 2>&1'`

但是,在阅读之前我需要这一行!我需要什么才能扭转2&gt;&amp; 1 ????

我的脚本看起来像是这样,并且在没有尝试过来的情况下工作用户干预:

LIST_FILE_NAME=$1
STILL_RUNNING=0

running=`ssh root@${HOSTNAME} 'su - root -c "cat '$LIST_FILE_NAME' | grep \"system running\"" 2>&1'`
if [[ $running =~ .*running.* ]]; then
        STILL_RUNNING=1
        echo "NODE $NODE running stop before continuing."
fi
if [ $STILL_RUNNING -eq 1 ]; then
        echo "Aborting system was still running!"
        exit 1
fi

echo "Do you want to continue? (yes/no):"
read CONTINUEQUESTION

tmp=$(tr '[:upper:]' '[:lower:]' <<<$CONTINUEQUESTION)
if [[ "$tmp" != 'y'  &&  "$tmp" != 'yes' ]]; then
                echo "Aborting because of input '$CONTINUEQUESTION'"
                exit
fi

echo "o.k."

4分:

  1. list.log可以有一行“system running”或“system notrunning”
  2. 如果list.log有一行“system notrunning”而不是bash脚本继续问题
  3. 在这个问题上,我从来没有正确地注入'y'或'yes'所以bash因为输入而中止''
  4. 我执行此操作:./myscript.sh list list.log(normal way)
  5. 如果用户在问题上进行交互,则此bash运行良好!

    谢谢你的时间!!!

3 个答案:

答案 0 :(得分:3)

你的行

$CONTINUEQUESTION='yes'

应该是

CONTINUEQUESTION='yes'

我不确定你是否正在用“是”这个词喂养标准差。您可以在echo之后添加read以确定。

答案 1 :(得分:2)

考虑这种变化:

#!/bin/bash
read -p "Do you want to continue? (yes/no): " CONTINUEQUESTION
if [[ $CONTINUEQUESTION != [Yy] && $CONTINUEQUESTION != [Yy][Ee][Ss] ]]; then
    echo "Aborting because of input '$CONTINUEQUESTION'."
    exit
fi

经过测试:

bash script.sh <<< yes

如果它不起作用,请显示输出:

bash -x script.sh <<< yes

答案 2 :(得分:0)

您可以使用heredoc:

bash -ex ./myscript.sh << 'EOF'
yes
EOF

Here Documents中搜索man bash

编辑:根据评论,您可以使用此ssh命令:

running=$(ssh -t -t root@${HOSTNAME} "grep 'system running' \"$LIST_FILE_NAME\"")