Ваша проблема с кавычками заключается в том, что после запуска команды с обратными кавычками она продолжается до следующей обратной кавычки. Это ваш код, как показано выше, за исключением того, что я удалил пустые строки.
a=115292a1504606846976ULL
b=2
if [ "$b" = "2" ]; then
var1=`echo $a | awk -F"U" '\
{
var2=`echo $var1 | awk -F"a"
{print " "$2}'`
}\
fi
( Обратные кавычки '`
' трудно отобразить в действующей уценке. )
В строке var1=
начинается выражение с обратными кавычками, которое заканчивается следующей неэкранированной обратной кавычкой, следующей после var2=
. Затем он читает остальную часть этой строки, а в следующей строке встречает одну кавычку. Когда он ищет следующую одинарную кавычку, ее нет - поэтому он сообщает об ошибке. Вы можете продемонстрировать, что это происходит поэтапно:
a=115292a1504606846976ULL
b=2
if [ "$b" = "2" ]; then
var1=`echo $a | awk -F"U" '\
{
var2=\`echo $var1 | awk -F"a"
{print " "$2}'`
}\
fi
В приведенном выше сценарии есть экранирование (обратная косая черта) перед обратной кавычкой после var2=
, поэтому теперь команда в обратных кавычках распространяется на обратную кавычку после строки print
. Это все еще не допустимая оболочка; строка с }\
объединяется с fi
для создания имени команды }fi
, поэтому вы все равно получаете неожиданную ошибку EOF - потому что fi
для конца if
отсутствует. Снова измените скрипт:
a=115292a1504606846976ULL
b=2
if [ "$b" = "2" ]; then
var1=`echo $a | awk -F"U" '\
{
var2=\`echo $var1 | awk -F"a"
{print " "$2}'`
#}\
fi
Это комментирует закрывающую фигурную скобку, и сценарий оболочки теперь 'valid'; настала очередь awk
, чтобы начать жаловаться на неверный скрипт, который ему дан.
++ awk -FU '{
var2=`echo $var1 | awk -F"a"
{print " "$2}'
awk: syntax error at source line 2
context is
>>> var2=` <<<
awk: illegal statement at source line 2
awk: illegal statement at source line 2
missing }
Другие люди дали вам примерно то, что вам нужно в качестве ответа. Я бы, вероятно, использовал Perl для разделения (и я подозреваю, что я мог бы потерять промежуточный массив @x
, если бы я потратил на него достаточно времени, производя сценарий строкового шума):
a=115292a1504606846976ULL
b=2
if [ "$b" = "2" ]
then var1=$(echo $a | perl -ne '@x=split /[aU]/; print "$x[1]\n"')
fi
Однако вы также можете сделать это в одной строке с awk
, таким образом:
a=115292a1504606846976ULL
b=2
if [ "$b" = "2" ]
then var1=$(echo $a | awk -Fa '{sub("ULL","",$2); print $2}')
fi
Это разделяет ввод на «а» вместо «U»; затем он удаляет ULL из второго поля и печатает его. Если вы хотите разделить на 'U', то вы используете:
a=115292a1504606846976ULL
b=2
if [ "$b" = "2" ]
then var1=$(echo $a | awk -FU '{sub("[0-9]+a", "", $1); print $1}')
fi
Регулярное выражение в sub
несколько сложнее.