В функцию передается просто строка. Если вы запустите func somevar
, будет передана строка somevar
. Если вы запустите func $somevar
, будет передано (слово -разделенное )значение переменной somevar
. Также это не ссылка на переменную, указатель или что-то в этом роде, это просто строки.
Если вы хотите передать имя переменной в функцию, а затем просмотреть значение этой переменной, вам потребуется использовать ссылку на имя (Bash 4.3 или более поздней версии, IIRC )или косвенная ссылка ${!var}
. ${!var}
расширяется до значения переменной, имя которой хранится в var
.
Итак, у вас просто неправильный способ в сценарии, если вы передаете имя переменной в функцию, используйте "${!1}"
, чтобы получить значение переменной, названной в $1
, и просто "$1"
, чтобы получить имя .
. это напечатает variable bar is empty, exiting
и закроет оболочку:
#!/bin/bash
exitIfEmpty() {
if [ -z "${!1}" ]; then
echo "variable $1 is empty, exiting"
exit 1
fi
}
foo=x
unset bar
exitIfEmpty foo
exitIfEmpty bar
Используя только awk
, вам нужно управлять несколькими совпадениями (, что-то вроде того, что вы можете найти в этом посте).
Это мой чистый-awk
раствор:
awk '{
match($0, /[0-9]+\/[0-9]+/); # match number/number pattern
pattern=substr($0,RSTART, RLENGTH); # store match in $pattern
match(pattern, /[0-9]+/); # match first number
num1=substr(pattern,RSTART,RLENGTH); # store it in $num1
sub(/[0-9]+\//,"",pattern); # remove 'number/' from $pattern
match(pattern, /[0-9]+/); # match second number
num2=substr(pattern,RSTART,RLENGTH); # store it in $num2
if ($num1 > $num2){ print num1, ">", num2 } # do your comparisons
else if ($num1 < $num2) { print num1, "<", num2 } # as you please
else { print num1, "=", num2 } # (this is just an example)
}' file
Однако , в этой ситуации я бы фактически использовал sed
для извлечения двух числовых значений, а затем передал бы вывод в awk
. Следующая команда делает то же самое, что и выше, но я думаю, что она функционально чище:
sed 's@^.*\([0-9]\+\)\/\([0-9]\+\).*$@\1 \2@' file |
awk '{if ($1 > $2){ print $1, ">", $2 }
else if ($1 < $2) { print $1, "<", $2 }
else { print $1, "=", $2 }}'
Вы можете использовать split
для разделения поля на основе второго разделителя, например.
$ awk 'split($2,a,"/") > 1 && a[2] > a[1]+0' file
session-manager-0 3/5 1 >>> want to compare second column value 3 and 5 using awk.
split
генерирует не менее 2 значений; и print
по умолчанию