Вернуть одно значение из функции скрипта оболочки

StackOverflow https://stackoverflow.com/questions/3139786

Вопрос

Пример:

#!/bin/sh

a() {
R=f
ls -1 a*
[ "$?" == "1" ] && { R=t; }
echo $R
}

r=`a`
echo $r

$r содержит t или f Но также вывод ls команда.

Я могу написать ls -1 a* >/dev/null 2>/dev/null, но если есть более сложный скрипт, который можно привести к ошибкам.

Есть ли способ вернуть одно значение из a() ?

Это было полезно?

Решение

Функция оболочки может вернуть числовое значение. Рассмотрим 0 и 1, а не «F» и «T»

#!/bin/sh

a() {
R=0
ls -1 a*
[ "$?" == "1" ] && { R=1; }
return $R
}

a
r=$?
echo $r

Это все еще будет писать вывод из ls -1 a* который вы, вероятно, все еще хотим распоряжаться, но ценность r будет либо 0, либо 1 и не будет включать вывод.

Другие примеры перенаправления вывода либо из строки или целого блока являются хорошими, и, как предложены другие, вы должны познакомиться с другими способами, чтобы проверить условия (но я предполагал ls был вроде произвольный пример)

Другие советы

Вам не нужно использовать ls Чтобы проверить файлы, начиная с a. Отказ Просто используйте оболочку

a() {
  shopt -s nullglob
  ret="f"
  for file in a*
  do   
    ret="t"
    break
  done
  echo "$ret"
}

Вы можете поставить перенаправление в список команд:

{command1 command2}> / dev / null

Если в какой-то момент в сценарии вы не хотите, чтобы выводиться из последующих команд, вы можете перенаправить вывод оболочки с exec Встроенный:

echo интересный exec> / dev / null echo скучно

Обратите внимание, что это длится до конца скрипта, а не только до конца функции. Это заботится о командах после интересного, но не раньше.

Есть способ отменить эффект exec /dev/null, Используя манипуляции дескриптора файлов. Я не обязательно рекомендую это, хотя, потому что это может быть сложно работать на практике. Идея состоит в том, чтобы переместить все, что подключено к стандартному выходу к другому дескриптору, затем перенаправить стандартную вывод в другой файл и, наконец, переместить исходный стандартный вывод назад к стандартному выводу.

{EXEC 3> & 1 # Дублируют FD 3 до FD 1 (стандартный вывод) EXEC> / dev / null # connect Стандартный вывод к / dev / null echo borling exec 1> & 3 # Подключите стандартный вывод назад к тому, что было сохранено в Echo Интереснаe exec> / dev / null # Подсоедините стандартный вывод к / dev / null снова echo Больше скучно} 3> / dev / null # установленный список должен иметь его FD 3 где-то подключен, #, хотя ничто не будет на самом деле не будет записано.
a() { 
ls -1 a*  > /dev/null
[ "$?" == "0" ] && echo t  || echo f

} 

r=`a` 
echo $r 

Рассмотрим использование [-F filename] и других файловых испытаний.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top