我在一个bash脚本中遇到了这个表达式,它真的不容易谷歌。
#$...
wvyml7n51#
#$“什么都不做”,因为#是开始注解,它后面同一行的所有内容都被忽略("shebang"是一个明显的例外)。$#是一个包含传递给shell脚本的参数数量的变量(就像$*是一个包含所有参数的变量)。
#$
#
$#
$*
hivapdat2#
在bash中,这通常是一个注解,哈希之后的所有内容(在同一行上)都被忽略。但是,如果你的bash脚本被传递给一些不寻常的东西,它可能会被解释为。例如,如果向Sun Grid Engine提交脚本:任何以hash-dollar开头的行,即#$,都是一个特殊的注解,SGE可以理解它来指定作业如何运行或在哪里运行。在本例中,我们指定了作业要运行的目录(#$ -cwd)和作业要加入的队列(#$ -q serial.q)。(来源:http://talby.rcs.manchester.ac.uk/~rcs/_linux_and_hpc_lib/sge_intro.html)
#$ -cwd
#$ -q serial.q
qc6wkl3g3#
我刚刚在一个脚本中遇到了一个#$,并想知道同样的事情。还有一个尚未提到的答案:在bash中搜索和替换(参见here)。通常情况下,它是这样工作的:
${PARAMETER/PATTERN/STRING}
PATTERN也可以包含 anchors,以在开始或结束时匹配它;即#和%:
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字符串中的#$。
sc4hvdpw4#
有可能预期的表达式是**$#而不是#$**
**$#**存储传递给shell程序的命令行参数的数量。
例如:
if [ $# -eq 0 ]; then echo "${USAGE}" >&2 exit 1 fi
如果命令行参数的数量为0,则显示存储在$USAGE变量中的消息。
9lowa7mx5#
当改变基数时,你可能会看到#$出现的一个地方是在算术表达式中:http://www.gnu.org/software/bash/manual/bashref.html#Shell-Arithmetic例如,echo $((2#101))将把101转换为基数2,并打印5。我最近在这里使用了这个:
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开头的数字视为八进制,所以我将它们转换为十进制。它并不完全使用#$,但是当我看了一会儿这段代码并试图记住是怎么回事时,我一开始以为那是一个表达式,发现了这个问题,所以这可能会帮助其他人。
$1
awk
009
5条答案
按热度按时间wvyml7n51#
#$
“什么都不做”,因为#
是开始注解,它后面同一行的所有内容都被忽略("shebang"是一个明显的例外)。$#
是一个包含传递给shell脚本的参数数量的变量(就像$*
是一个包含所有参数的变量)。hivapdat2#
在bash中,这通常是一个注解,哈希之后的所有内容(在同一行上)都被忽略。但是,如果你的bash脚本被传递给一些不寻常的东西,它可能会被解释为。
例如,如果向Sun Grid Engine提交脚本:
任何以hash-dollar开头的行,即
#$
,都是一个特殊的注解,SGE可以理解它来指定作业如何运行或在哪里运行。在本例中,我们指定了作业要运行的目录(#$ -cwd
)和作业要加入的队列(#$ -q serial.q
)。(来源:http://talby.rcs.manchester.ac.uk/~rcs/_linux_and_hpc_lib/sge_intro.html)
qc6wkl3g3#
我刚刚在一个脚本中遇到了一个
#$
,并想知道同样的事情。还有一个尚未提到的答案:在bash中搜索和替换(参见here)。通常情况下,它是这样工作的:
PATTERN
也可以包含 anchors,以在开始或结束时匹配它;即#
和%
:你也可以使用一个变量
PATTERN
- * 和 * 跳过斜杠来增加混乱(并用一个空字符串替换模式匹配):这里是bash字符串中的
#$
。sc4hvdpw4#
有可能预期的表达式是**$#而不是#$**
**$#**存储传递给shell程序的命令行参数的数量。
例如:
如果命令行参数的数量为0,则显示存储在$USAGE变量中的消息。
9lowa7mx5#
当改变基数时,你可能会看到
#$
出现的一个地方是在算术表达式中:http://www.gnu.org/software/bash/manual/bashref.html#Shell-Arithmetic例如,
echo $((2#101))
将把101
转换为基数2,并打印5
。我最近在这里使用了这个:
第一个论点(
$1
)的格式我不记得是用awk
得到的。毫秒参数被解析为009
,持续了9毫秒。然而,bash将以前导0开头的数字视为八进制,所以我将它们转换为十进制。它并不完全使用#$
,但是当我看了一会儿这段代码并试图记住是怎么回事时,我一开始以为那是一个表达式,发现了这个问题,所以这可能会帮助其他人。