AWK: Почему $* работает в функции удара, но не под каналом?

@terdon в этом сообщении ответил на связанный мой вопрос, но я пропустил еще один вопрос в том сообщении.

См. следующие команды:

calc(){ awk "BEGIN{ print $* }" ;}; calc "((3+(2^3)) * 34^2 / 9)-75.89"

Вышеупомянутые команды хорошо работают с расчетным результатом '1337'.

echo '((3+(2^3)) * 34^2 / 9)-75.89' | awk "BEGIN{ print $* }"

Но вышеупомянутые команды не дают результата, в то время как @terdon объяснил хорошо о почему.

Вы могли советовать тому, что заставило первый пример работать с $*?

2
задан 2 January 2019 в 06:11

1 ответ

$* относится к позиционным параметрам - те переменные, которыми ссылаются $1 и $2 и так далее, и обеспечиваются как аргументы сценариям и функциям. Это - ключ к Вашему вопросу.

Когда у Вас есть интерактивная оболочка, нет никакого позиционного набора параметров по умолчанию, таким образом, $* пусто. Можно заставить его работать при установке тех, которые через set "((3+(2^3)) * 34^2 / 9)-75.89" команда, которая сделает $1 равняйтесь той строке.

Различие с calc(){ awk "BEGIN{ print $* }" ;}; это, это - функция, и функции могут обработать позиционные параметры (их, не оболочка). Когда Вы звоните calc "((3+(2^3)) * 34^2 / 9)-75.89" Вы вызываете функцию с позиционным параметром "((3+(2^3)) * 34^2 / 9)-75.89". Там $* не будет пусто:

$ calc(){ echo "Params: '$*'"; awk "BEGIN{ print $* }" ;}; calc "((3+(2^3)) * 34^2 / 9)-75.89"
Params: '((3+(2^3)) * 34^2 / 9)-75.89'
1337
3
ответ дан 2 December 2019 в 02:41

Другие вопросы по тегам:

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