首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Bash函数组件独立工作,但不能协同工作

Bash函数组件独立工作,但不能协同工作
EN

Stack Overflow用户
提问于 2012-03-21 06:53:34
回答 4查看 99关注 0票数 0

我有一个bash脚本,其中包含以下函数:

代码语言:javascript
复制
function start_vi()
{
   echo "Please enter a file name with complete path to open in vi:"
   read input_file

   if [ -d "$input_file" ]
   then
      echo "You entered a directory."
      echo "Please try again and enter a readable/writable file."
   fi

   grep_var="file $input_file | grep -c data"

   if [ $? -eq 0 ]
   then
      vi $input_file
   else
      echo "File not found or invalid file type. Please try again."
   fi
}

在大多数情况下,该函数工作得很好。我的问题是,这两个if语句独立工作得很好,例如,如果我注释掉其中的一个,测试就会工作,它会做我想做的事情。但总而言之,例如,当我在提示符下输入一个目录时,vi会将其作为一个文件打开,其中测试应该返回一个回显,说明它是一个目录,就像它单独运行时一样。

你知道为什么会这样吗?我在bash脚本编写方面还是个新手,所以这对专业人士来说可能很容易,但我已经有一段时间在碰壁了。

提前谢谢。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-03-21 07:00:03

在第一个if/then中添加一条return语句

代码语言:javascript
复制
function start_vi()
{
   echo "Please enter a file name with complete path to open in vi:"
   read input_file

   if [ -d "$input_file" ]
   then
      echo "You entered a directory."
      echo "Please try again and enter a readable/writable file."
      return
   fi

   grep_var="file $input_file | grep -c data"

   if [ $? -eq 0 ]
   then
      vi $input_file
   else
      echo "File not found or invalid file type. Please try again."
   fi
}

否则,它将打印并打开文件,因为您的第二个测试应该如下所示:

代码语言:javascript
复制
   file $input_file | grep -c data

   if [ $? -eq 0 ]

$?是上次运行命令的退出代码。为变量赋值(即grep_var="...")会将$?设置为0。你似乎想要的是grep -c data的退出代码-在这种情况下,使用反引号`而不是引号‘来运行命令,如下所示。或者你可以这样写:

代码语言:javascript
复制
   grep_var=`file $input_file | grep -c data`

   if [ $grep_var != 0 ]

比较字符串值(即grep -c data返回的内容- data行的计数)。

执行上面的一些操作应该可以解决问题。

票数 3
EN

Stack Overflow用户

发布于 2012-03-21 06:59:29

你所需要的只是一个循环:

……

代码语言:javascript
复制
read input_file
while [ ! -f "$input_file" ]
do
      echo "You did not enter a file"
      echo "Please try again and enter a readable/writable file."
      read input_file
done

grep_var="file $input_file | grep -c data"

if [ $? -eq 0 ]
then
  vi $input_file
else
  echo "File not found or invalid file type. Please try again."
fi
票数 1
EN

Stack Overflow用户

发布于 2012-03-21 07:03:43

你需要一个循环

代码语言:javascript
复制
function start_vi()
{
   echo "Please enter a file name with complete path to open in vi:"
   read input_file

   while [ -d "$input_file" ]
   do
      echo "You entered a directory."
      echo "Please try again and enter a readable/writable file."
      read input_file
   done

   grep_var="file $input_file | grep -c data"

   if [ $? -eq 0 ]
   then
      vi $input_file
   else
      echo "File not found or invalid file type. Please try again."
   fi
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9796250

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档