linux - скрипты - основы bash. часть 2




Вывод трубы в функцию bash (4)

1) Я знаю, что это довольно старый пост

2) Мне нравится большинство ответов здесь

Тем не менее, я нашел этот пост, потому что мне нужно было что-то подобное. В то время как все согласны с тем, что stdin - это то, что нужно использовать, то, что здесь отсутствует, является фактическое использование файла / dev / stdin.

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

Мое решение:

jc_hms() { 
  declare -i i=${1:-$(</dev/stdin)};
  declare hr=$(($i/3600)) min=$(($i/60%60)) sec=$(($i%60));
  printf "%02d:%02d:%02d\n" $hr $min $sec;
}

В бою:

[email protected]:pwd$ jc_hms 7800
02:10:00
[email protected]:pwd$ echo 7800 | jc_hms 
02:10:00

Надеюсь, это может помочь кому-то.

Счастливый взлом!

У меня есть простая функция в сценарии bash, и я хотел бы передать stdout на него как входной.

jc_hms(){
  printf "$1"
}

Я бы хотел использовать его таким образом.

var=`echo "teststring" | jc_hms`

Конечно, я использовал избыточные функции echo и printf, чтобы упростить вопрос, но вы получите эту идею. Прямо сейчас я получаю ошибку «не найден», которая, как я полагаю, означает, что мое разграничение параметров неверно (часть «$ 1»). Какие-либо предложения?

Первоначально функция jc_hms использовалась следующим образом:

echo `jc_hms "teststring"` > //dev/tts/0

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

EDIT: Поэтому, чтобы уточнить, я НЕ пытаюсь печатать материал в последовательный порт, я хотел бы взаимодействовать с моими функциями bash, если "|" характер трубы, и мне интересно, возможно ли это.

EDIT: Хорошо, вот полная функция.

jc_hms(){
  hr=$(($1 / 3600))
  min=$(($1 / 60))
  sec=$(($1 % 60))

  printf "$hs:%02d:%02d" $min $sec
}

Я использую функцию для формирования строки, которая соответствует этой строке кода

songplaytime=`echo $songtime | awk '{print S1 }'`
printstring="`jc_hms $songplaytime`"  #store resulting string in printstring

Где $ songtime - это строка, выраженная как «общее время воспроизведения», ограниченное пробелом.

Мне жаль, что я не могу просто сделать это в одной строке и передать его после awk

printstring=`echo $songtime | awk '{print S1 }' | jc_hms`

вот так.


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

jc_hms(){
  while read data; do
      printf "%s" "$data"
  done
}

должно быть то, что вы хотите


Мне нравится ответ user.friendly, используя встроенный синтаксис подстановки условного синтаксиса Bash . Вот небольшая настройка, чтобы сделать его ответ более общим, например, для случаев с неопределенным количеством параметров:

function myfunc() {
    declare MY_INPUT=${*:-$(</dev/stdin)}
    for PARAM in $MY_INPUT; do
        # do what needs to be done on each input value
    done
}

Хммм ....

songplaytime=`echo $songtime | awk '{print S1 }'`
printstring="`jc_hms $songplaytime`"  #store resulting string in printstring

если вы все равно звоните awk, почему бы не использовать его?

printstring=`TZ=UTC gawk -vT=$songplaytime 'BEGIN{print strftime("%T",T)}'`

Я предполагаю, что вы используете Gwu's Awk, который является лучшим и также бесплатным; это будет работать в общих дистрибутивах Linux, которые не обязательно используют последний gawk. Самые последние версии gawk позволят вам указать UTC в качестве третьего параметра функции strftime ().







pipe