Как передать значение переменной из функции в вызывающую процедуру в Shellscript [закрыто]

UTF -8 tiene varias trampas y, por esta razón, no es la codificación típica en Europa central.

Escribir programas que asumen UTF -8 es una mala práctica, ya que es posible que ni siquiera pueda saber dónde termina un "carácter" en el flujo de bytes.

Un programa decente llama:

setlocale(LC_ALL, "")

al inicio y posteriormente utiliza funciones como:

mbtowc(&wc, input, amt)

para convertir lecturas de entrada multibyte desde stdin o archivos.

Luego procesa los datos como caracteres anchos y los vuelve a convertir en datos de varios bytes a través de:

wctomc(output, wc)

luego la salida se imprime en, p. salida estándar.

0
05.09.2018, 05:20
2 ответа

Ваши условные команды неверны :[не просто синтаксис, это на самом деле команда . И, как и любой команде, ей нужен пробел, чтобы отделить ее от аргументов.

Нет

if [$l_var = "C"]

но

if [ "$l_var" = "C" ]
#..^........^.^...^   mandatory whitespace

Обратите внимание на добавление кавычек вокруг левой -переменной. Очень важный.


Проблема в том, что вы пытаетесь установить глобальную переменную в подоболочке. Вы не можете сделать так, чтобы :дочерняя оболочка (, созданная путем запуска функции в фоновом режиме, )не могла изменить среду родителя.

Самый простой способ — записать новое значение в файл, и когда фоновый процесс завершится (здесь поможет команда wait), вы можете прочитать значение из файла

#!/bin/bash
tmpfile=$(mktemp)
l_var='N';

func1() {
    l_var='C'
    # do some logic which will take time
    sleep 5
    echo "$l_var" > "$tmpfile"
    echo "$FUNCNAME complete"
}

func2() {
    l_var2='C'
    # do some logic which will take time
    sleep 1
    echo "$FUNCNAME: l_var2=$l_var2"
}

func3() {
    l_var3='C'
    # do some logic which will take time
    echo "$FUNCNAME: l_var3=$l_var3"
}

echo "start: l_var=$l_var"

#  call function1 and function2 parallaly
func1 &
func2

# wait for func1, then read the new value from the file
wait
l_var=$(< "$tmpfile")

echo "after func1, l_var=$l_var"

# once function1 one completed, then call function3
if [[ "$l_var" == "C" ]]; then
    func3
fi

выходы

start: l_var=N
func2: l_var2=C
func1 complete
after func1, l_var=C
func3: l_var3=C
0
28.01.2020, 04:13

Для этого может пригодиться копроцесс ksh

#!/usr/bin/ksh

func1() {
  sleep $1
  echo "X${1}X"
}

func2() {
  sleep $1
  echo "Y${1}Y"
}

func3() {
  sleep $1
  echo "Z${1}Z"
}

func1 10 |&
exec 5>&p #  assign fd 5 to stdout 
exec 6<&p #  and fd 6 to stdin

func2 7 &

func3 5 |&

read -u6 F1A
read -p  F3A

echo $F1A
echo $F3A
echo "wait until all is done"
wait
0
28.01.2020, 04:13

Теги

Похожие вопросы