Как использовать printf для показа результатов вычисления?

CMD произведенный ps или имя процесса или аргументы, переданные команде (включая первый аргумент argv[0]). Хотя это переносит некоторое отношение с путем исполняемого файла, нет никакой гарантии их, чтобы быть связанной.

На Linux:

print -r -- /proc/self/exe(:A)

На Darwin и Linux и возможно других:

lsof -ap"$$" -dtxt  -Fn | sed '2!d;s/.//;q'

Но я не знаю, насколько надежный это.

Другая эвристика:

print -r -- ${${0#-}:c:A}

$0, как Вы видят в выводе PS, содержит первый аргумент это zsh полученный (argv[0]), или при передаче сценарий как аргумент, тот аргумент.

В первом случае, обычно, (условно, нет никакой гарантии), это argv[0] был бы любой путь включая a / (относительный или абсолютный), или zsh (что-то без /) в этом случае вызывающая сторона будет искать zsh в его $PATH или его хеш-таблица команды... Если путь будет относителен, то вышеупомянутый метод будет только работать, если текущий каталог не изменился, так как zsh был вызван. Если существует нет /, метод будет только работать если zsh ищет исполняемый файл тот же путь, как вызывающая сторона сделала.

В случае сценария это - путь сценария, который будет возвращен вместо того из интерпретатора (вопреки первым двум решениям).

3
30.11.2014, 17:51
1 ответ

Вы не делаете то, что вы думаете, что делаете. Эта команда:

TAX="echo $salary * 0.15 | bc"

ничего не запускает, нет расчета. Это присваивает строку в переменной долл. США . Затем, потому что вы не цитируете переменную, когда вы передаете ее на PrintF , * будет расширяться ко всему в текущем каталоге. Чтобы проиллюстрировать:

$ ls
file1  file2
foo="echo 12 * 4 | bc"
$ echo $foo
echo 12 file1 file2 4 | bc

, как вы можете видеть выше, * расширился до содержимого каталога, и не было сделано расчет. Чтобы назначить результат команды на переменной, вы должны использовать var = $ (команду) , а не цитаты.

Итак, рабочая версия вашего сценария будет:

#!/bin/sh
printf 'Please enter salary amount: '
read salary
TAX=$(printf '%s * %s\n' "$salary" "0.15" | bc)
NET=$(printf '%s + %s\n' "$salary" "$TAX" | bc)

printf "Net Salary= %.2f\n" $NET

при отладке чего-то вы всегда должны думать о печати ваших переменных, чтобы понять, что они содержат.

8
27.01.2020, 21:11

Теги

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