Я натолкнулся на это выражение в bash script, и это действительно нелегко для Google.
#$...
Спасибо за вашу помощь!
Я натолкнулся на это выражение в bash script, и это действительно нелегко для Google.
#$...
Спасибо за вашу помощь!
#$
делает "ничего", поскольку #
запускает комментарий, а все за ним на одной строке игнорируется (за исключением "shebang" ).
$#
, как и у вас, печатает количество аргументов, переданных оболочке script (например, $*
печатает все аргументы).
В bash это обычно комментарий, все после хеша (в той же строке) игнорируется. Однако, если ваш bash script передается на что-то необычное, его можно интерпретировать.
Например, если вы отправляете script в Sun Grid Engine: "Любая строка, начинающаяся с хеш-доллара, т.е. # $, Является специальным комментарием, который понимается SGE, чтобы указать что-то о том, как и где выполняется задание. В этом случае мы указываем каталог, в котором должно выполняться задание (# $-cwd) и очередь, в которую будет выполняться задание (# $-q serial.q)." (источник: http://talby.rcs.manchester.ac.uk/~rcs/_linux_and_hpc_lib/sge_intro.html)
Возможно, что предполагаемое выражение было $# вместо # $
$# Сохраняет количество аргументов командной строки, которые были переданы программе оболочки.
например:
if [ $# -eq 0 ]; then
echo "${USAGE}" >&2
exit 1
fi
Отображает сообщение, хранящееся в переменной $USAGE, если число аргументов командной строки равно 0.
Я только что встретил #$
в script и задавался вопросом то же самое. Существует ответ, который еще не упоминался: в bash поиск и замена (см. здесь).
Обычно он работает следующим образом:
${PARAMETER/PATTERN/STRING}
PATTERN
может также содержать якоря, чтобы соответствовать ему либо в начале, либо в конце; а именно #
и %
:
MYSTRING=ABCCBA
echo ${MYSTRING/#A/y} # RESULT: yBCCBA
echo ${MYSTRING/%A/y} # RESULT: ABCCBy
Вы также можете использовать переменную для PATTERN
- и пропустить косые черты, чтобы добавить к путанице (и заменить совпадение шаблона пустой строкой):
echo ${MYSTRING#$PATTERN} # RESULT: BCCBA
echo ${MYSTRING%$PATTERN} # RESULT: ABCCB
И вот он, #$
в строке bash.
Одно место, где вы можете увидеть #$
, появляется внутри арифметического выражения при смене базы: http://www.gnu.org/software/bash/manual/bashref.html#Shell-Arithmetic
Например, echo $((2#101))
преобразует 101
в базу два и напечатает 5
.
Недавно я использовал это здесь:
calculate_time() {
minutes=$((${1:0:1} + ${1:9:1}))
seconds=$((${1:2:1} + ${1:11:1}))
milliseconds=$((10#${1:4:3} + 10#${1:13:3}))
result=$((${minutes}*60*1000 + ${seconds}*1000 + ${milliseconds}))
echo $result
}
Первый аргумент ($1
) был в некотором формате, я не помню, что был сделан с помощью awk
. Аргумент в миллисекундах анализировался как 009
за 9 миллисекунд. Тем не менее, bash обрабатывает числа, начинающиеся с ведущего 0 как восьмеричные, поэтому я преобразовал их в десятичные. Это не совсем с помощью #$
, но когда я посмотрел на этот код через некоторое время и попытался вспомнить, что происходит, я подумал, что это выражение было первым и нашло этот вопрос, поэтому это может помочь кому-то другому.