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.
Ваши условные команды неверны :[
не просто синтаксис, это на самом деле команда . И, как и любой команде, ей нужен пробел, чтобы отделить ее от аргументов.
Нет
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
Для этого может пригодиться копроцесс 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