2013-12-19 71 views
0

在Debian上是下面的代码工作,但在CentOS上它只是中止没有任何错误。什么是错误?我无法理解它。Bash-Shell脚本在没有错误的情况下中止

echo "Test 1" 
    ANSWER="" 
    read -p "Enter y or n " ANSWER; 
    echo "Test 2" 

输出看起来八方通这样的:

Test 1 

我也试过没有参数-p读命令,但是这也不能工作:

echo "Test 1" 
    ANSWER="" 
    echo "Enter y or n " 
    read ANSWER; 
    echo "Test 2" 

输出:

Test 1 
    Enter y or n 

如果我执行在命令行命令是它的工作,它应该如何。该脚本具有以下“标题”:#!/ bin/bash

有人可以帮忙吗?

+0

'type read'的输出是什么? – anubhava

+0

@anubhava“read是一个shell内建” - 在这两个系统 – user2966991

+1

上是否中止返回到您的shell,还是等待输入?这可能是一个缓冲问题。 – Donovan

回答

0

@user2966991 - 从标准输入读取的脚本位于较大的while循环内,该循环通过标准输入读取文件。这不起作用。尝试将您的标准输入重定向到不同的文件处理程序。

请考虑这个示例代码。由于while循环和read都是从stdin读取的,所以这不起作用。

#!/bin/bash 
cat samplefile | while read line; do 
    read -p "$line (y/n)?" ANSWER 
done 

现在考虑这个其他的代码。

#!/bin/bash 
# save stdin to file descriptor 5 
exec 5<&0 

cat samplefile | while read line; do 
    read -p "$line (y/n)?" ANSWER <&5 
done 

# restore stdin and close file descriptor 5 
exec 0<&5 5>&- 

个人而言,我更喜欢输入重定向而不是管道。

cat file | while read var; do 
... 
done 

可以写成

while read var; do 
... 
done < file 

下一次,请在这里发表您的脚本或你不会得到任何答案。

+0

@ user3088572太棒了!非常感谢你!但是我对你的解决方案有两个问题。 1.描述符是否类似于C++中指向存储地址的指针?如果我正确地告诉我,我也可以使用描述3到9或? 2.为什么你更喜欢输入redircetion比管道?有没有任何性能提升? – user2966991

+0

是的,它是一个指向FILE的指针。描述符0是标准输入,1是标准输出,2是标准错误。你一定可以使用3到9.通过使用输入重定向,我可以避免运行额外的进程,这会对缓慢负载的服务器造成不利影响。在一个健康的系统中,你不会注意到其中的差异。 – alvits

+0

@ user3088572啊,好的。非常感谢您提供这些信息! :) – user2966991

0

试试这个

#!/bin/bash 

echo "Test 1" 
read -p "Enter y/n: " ANSWER 
echo " Test 2: ${ANSWER}" 

你并不需要在回答最后一个结束。

+0

它的工作方式很小,但不是在我的大脚本中。脚本的第二行写有“set -e”。如果我评论它,它不会中止,但它也不会显示带有输入的消息。代码如下所示: ANSWER =“” while [[“$ ANSWER”==“”]];做 读-p“输入y/n:”答案 fi – user2966991

+0

@ user2966991 - 如果它是作为一个小脚本,我期望,那么问题不在此代码块内。你有没有检查过,如果在大脚本中填充输入缓冲区,它会不知何故被拖到这个区块? – alvits

+0

另外,set -e用于调试目的,所以脚本将在出错时解救出来。该脚本遇到错误情况,这就是为什么当设置“set -e”时它会中止。 – alvits

相关问题