Компоненты Bash Function работают независимо, но не вместе - PullRequest
0 голосов
/ 21 марта 2012

У меня есть скрипт bash, в котором есть эта функция:

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, так что, наверное, это легко для профессионалов, но я уже некоторое время бьюсь головой о стену.

Заранее спасибо.

Ответы [ 4 ]

3 голосов
/ 21 марта 2012

Добавьте оператор return в первый if/then:

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
}

В противном случае он все равно распечатает, а затем откроет файл, так как ваш второй тест должен выглядеть следующим образом:

   file $input_file | grep -c data

   if [ $? -eq 0 ]

$? - это код завершения последней команды запуска.Присвоение переменной (т. Е. grep_var="...") устанавливает $? в 0. То, что вы, похоже, хотели, это код выхода grep -c data - в этом случае используйте для запуска команд обратные клавиши `вместо кавычек ', как показано ниже.Или вы можете написать это так:

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

   if [ $grep_var != 0 ]

, чтобы сравнить строковое значение (то есть, что grep -c data возвращает - количество data строк).

Выполнение некоторых из вышеперечисленныхдолжен решить проблему.

1 голос
/ 21 марта 2012

Вам нужна петля

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 голос
/ 21 марта 2012

Все, что вам нужно, это цикл:

....

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
0 голосов
/ 21 марта 2012

Я думаю, это может быть ближе к тому, что вы хотите сделать ..

function start_vi()
{
   echo "Please enter a file name with complete path to open in vi:"
   read input_file
   grep_var=`file $input_file 2>&1 | grep -c data`
   while [ $? -ne 0 ]
   do
      echo "File not found or invalid file type. Please try again."
      read input_file
      grep_var=`file $input_file 2>&1 | grep -c data`
   done
   vi $input_file
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...