Вышеупомянутый ответ работает большую часть времени, но использует следующий сценарий:
#!/bin/bash
a='foo: '
b='44494949494'
if [ ${a} -eq ${b} ]
then
echo "a matches b"
else
echo "a is different than b"
fi
Вместо того, чтобы полностью повторять один из вышеперечисленных вариантов, он выполняет следующие действия:
./test.sh: line 6: [: foo:: integer expression expected
a is different than b
Чтобы скрипт работал должным образом (например, сравнивал значения как строки) , вам нужно изменить сравнение на:
if [ ${a} = ${b} ]
Тривиально можно решить, каким должен быть $0
. Просто создайте ссылку:
$ cat foo.sh
#! /bin/bash
readonly SCRIPT_HELP="$(cat <<EOF
Usage: $(basename "$0") [-h]
EOF
)"
echo "${SCRIPT_HELP}"
$ ./foo.sh
Usage: foo.sh [-h]
EOF
$ ln -s foo.sh bar.sh
$ ./bar.sh
Usage: bar.sh [-h]
EOF
В данном конкретном случае нет, я не думаю, что это можно будет использовать с какой-либо большой пользой. "$0"
и SCRIPT_HELP
заключаются в кавычки при использовании (внутри подстановок вложенных команд и здесьдокументов, но, тем не менее, в кавычки), и они не оцениваются
ed.
$ ln -s ./foo.sh '"; echo rm -rf ~; echo"'
$ ./\"\;\ echo\ rm\ -rf\ \~\;\ echo\"
Usage: "; echo rm -rf ~; echo" [-h]
EOF
$0
может быть любым, что захочет вызывающий скрипт. Это путь к сценарию, и вызывающая сторона может сделать копию или ссылку на сценарий в любом месте.
Однако это не является уязвимостью само по себе, если скрипт не работает с большими привилегиями, чем его вызывающий. Если исполняемый файл сценария не является привилегированным, вызывающая сторона может запустить другую программу. Это может стать уязвимостью, если вызывающая сторона сама является привилегированной и ее можно убедить передать другой $0
.
Если скрипт выполняется с привилегиями, то значение $0
зависит от метода, используемого для повышения привилегий. Если сценарий вызывается через символическую ссылку на исполняемый файл с setuid, тогда $0
может быть произвольным (однако большинство систем отказываются от исполняемых файлов с setuid).
Несмотря на отсутствие последствий для безопасности в большинстве сценариев в этом конкретном случае, ваш сценарий не полностью устойчив к произвольному $0
. Двойные кавычки в "$0"
приводят к тому, что значение используется как есть (тогда как $0
без кавычек будет рассматриваться как список шаблонов подстановочных знаков). Но когда команда basename
видит это значение как аргумент, она будет обрабатывать его по-разному в зависимости от того, начинается ли значение с -
. Если значение начинается с -
(а не просто -
), то это вариант.По крайней мере, в GNU базовое имя
аргумент без опций является обязательным, поэтому вызов его с одним аргументом, начинающимся с -
, приведет только к ошибке. Но это более серьезная проблема с некоторыми другими командами. Чтобы справиться с произвольными значениями, включая те, которые начинаются с -
, поставьте --
перед аргументом, чтобы указать, что больше не следует никаких опций: basename -- "$0"
.