Переменная с разделителями NUL

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

Однако, когда я перешел с Windows на Linux на своем рабочем столе, мне нужно было преобразовать множество пре-существующих .BATи .CMDфайлов, и я не собирался переписывать для них логику, поэтому Я нашел способ сделать gotoв bash, который работает, потому что goto functionзапускает sedсам по себе, удаляя любые части сценария, которые не должны выполняться,а потом все оценивает:

#!/bin/bash

# BAT / CMD goto function
function goto
{
    label=$1
    cmd=$(sed -n "/^:[[:blank:]][[:blank:]]*${label}/{:a;n;p;ba};" $0 | 
          grep -v ':$')
    eval "$cmd"
    exit
}

apt update

# Just for the heck of it: how to create a variable where to jump to:
start=${1:-"start"}
goto "$start"

: start
goto_msg="Starting..."
echo $goto_msg
# Just jump to the label:
goto "continue"

: skipped
goto_msg="This is skipped!"
echo "$goto_msg"

: continue
goto_msg="Ended..."
echo "$goto_msg"

# following doesn't jump to apt update whereas original does
goto update

и я совсем не чувствую себя виноватым, как сказал Линус Торвальдс:

From: Linus Torvalds
Subject: Re: any chance of 2.6.0-test*?
Date: Sun, 12 Jan 2003 11:38:35 -0800 (PST)

I think goto's are fine, and they are often more readable than large amounts of indentation. That's especially true if the code flow isn't actually naturally indented (in this case it is, so I don't think using goto is in any way clearer than not, but in general goto's can be quite good for readability).

Of course, in stupid languages like Pascal, where labels cannot be descriptive, goto's can be bad. But that's not the fault of the goto, that's the braindamage of the language designer.

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

4
09.06.2019, 19:52
2 ответа

Это факт, что вы не можете хранить \0нулевые байты в контексте строки bash из-за лежащей в основе реализации C. См. Почему $'\0' или $'\x0' — пустая строка? Должен быть нулевой символ -, не так ли? .

Одним из вариантов может быть удаление нулевых байтов после команды сортировки в конце конвейера с использованием trи сохранение результата для решения непосредственной проблемы выдаваемого предупреждающего сообщения. Но это все равно оставило бы вашу логику ошибочной, поскольку имена файлов с новыми строками все равно были бы нарушены.

Используйте массив, используйте команду mapfileили readarray(в bash 4.4+ ), чтобы напрямую вводить результаты команды find

IFS= readarray -t -d '' samples < <(find. -type d -iregex './sample[0-9][0-9]' -printf "%f\0" | sort -z)
8
27.01.2020, 20:46

Оболочка bashне поддерживает то, что вы хотите сделать. Оболочка zshработает из коробки.

% mkdir sample11 SAMple12 sample21 sample22 dir1
% ll
total 20
drwxrwxr-x 2 fpm fpm 4096 Jun  9 13:46 dir1
drwxrwxr-x 2 fpm fpm 4096 Jun  9 13:46 sample11
drwxrwxr-x 2 fpm fpm 4096 Jun  9 13:46 SAMple12
drwxrwxr-x 2 fpm fpm 4096 Jun  9 13:46 sample21
drwxrwxr-x 2 fpm fpm 4096 Jun  9 13:46 sample22
% samples=$(find. -type d -iregex './sample[0-9][0-9]' -print0 | sort -z)
% echo $samples
./sample11./SAMple12./sample21./sample22
% echo $samples | od -a
0000000  .   /   s   a   m   p   l   e   1   1 nul  .   /   S   A   M
0000020   p   l   e   1   2 nul  .   /   s   a   m   p   l   e   2   1
0000040 nul  .   /   s   a   m   p   l   e   2   2 nul  nl
0000055
%
6
27.01.2020, 20:46

Теги

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