проверка того, принимает ли сценарий командной строки аргумент перед запуском

Значение Physmem из статистики system_pages даст вам количество страниц, которые видит ОС. Вам необходимо умножить это число на размер страницы по умолчанию, который может составлять 4 КБ или 8 КБ в зависимости от вашей архитектуры:

$ kstat -n system_pages -p -s physmem |
    nawk -v pagesize=$(pagesize) '{print $2*pagesize/1024/1024 "MB"}'
4017.64MB

Обратите внимание, что это может не соответствовать реальному размеру установленной ОЗУ, поскольку часть ее уже могла быть захвачена оборудованием до ОС загружается.

1
14.08.2017, 18:03
3 ответа

Вы не можете. Этот вопрос вообще неразрешим -какой бы алгоритм вы ни изобретали, можно привести пример, когда он не сработает. Просто чтобы подогреть аппетит, рассмотрите следующие скрипты -принимают ли они аргумент или нет?

# script 1
false && echo catch $1 if you can

# script 2
x='$'
y=1
eval echo $x$y
3
28.04.2021, 23:57

Требование не имеет смысла. Программа получает список аргументов командной строки и выбирает, что с ним делать. Сценарий оболочки или любая другая программа принимает столько аргументов командной строки, сколько хочет.

Вы можете определить «принимает аргументы командной строки» как «не делает ничего полезного при вызове с 0 аргументами». Но тогда вам нужно определить «полезный». Приведенный вами пример сценария что-то делает, когда вызывается без аргументов :, он печатает пустую строку. Почему вы определяете печать пустой строки как бесполезную?

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

Вам нужно переосмыслить свою проблему . Что вы подразумеваете под «принимает аргументы командной строки»? Как только вы определите свою проблему, вы будете ближе к решению.

0
28.04.2021, 23:57

sh-совместимые сценарии оболочки, которые используют аргументы в командной строке, часто содержат либо $1, $2, $3и т. д., либо $@, либо $*, либо их комбинации. Однако это не является ни необходимым, ни достаточным!

Этот скрипт выполняет поиск и возвращает все строки, содержащие такие строки.:

grep '\$[1-9@*]' script.sh

Вы можете получать ложные срабатывания от сценариев, которые не принимают аргументы командной строки, но содержат функции, принимающие аргументы, или сценариев, которые просто содержат эти символы в неоцененных строках. Если сценарий содержит, например, вызовы awk, то они также могут содержать $1и т. д., которые не относятся к аргументам командной строки самого сценария.

Вы также можете поискать строку getoptв скрипте, чтобы узнать, использует ли скрипт getoptили getoptsдля правильного разбора командной строки.

Выявление случаев, когда аргументы командной строки могут использоваться неявно , немного сложнее. Это происходит, например, с for variablename; do... doneили select variablename; do... done. Но если сценарий использовал setдля явного заполнения позиционных параметров, то это не затрагивает никаких аргументов командной строки. Чтобы разобраться в этом, может потребоваться визуальный осмотр сценария.

В «реальной жизни»можно было бы прочитать сопроводительную документацию. Если по какой-то странной причине это недоступно, прочтите код.

5
28.04.2021, 23:57

Теги

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