#$在bash中做什么?(又名:哈希美元符号,英镑符号)

CAN*_*CAN 32 bash shell

我在一个bash脚本中遇到了这个表达式,谷歌真的不容易.

#$...
Run Code Online (Sandbox Code Playgroud)

谢谢你的帮助!

Chr*_*n.K 40

#$"没有",就像#开始评论一样,同一行后面的一切都被忽略了("shebang"除外).

$#,就像你拥有它一样,打印传递给shell脚本的参数数量(比如$*打印所有参数).


小智 19

在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)

  • 这是我在 SGE 中找到的用例。谢谢。 (2认同)

Flo*_* Bw 15

我刚刚遇到#$一个脚本,并想知道同样的事情.有答案尚未提及:在bash搜索和替换(见这里).

通常,它的工作原理如下:

${PARAMETER/PATTERN/STRING}
Run Code Online (Sandbox Code Playgroud)

PATTERN还可以包括,以便在开头或结尾匹配它; 即#%:

MYSTRING=ABCCBA
echo ${MYSTRING/#A/y}  # RESULT: yBCCBA
echo ${MYSTRING/%A/y}  # RESULT: ABCCBy
Run Code Online (Sandbox Code Playgroud)

您还可以使用变量PATTERN- 跳过斜杠以添加混淆(并将模式匹配替换为空字符串):

echo ${MYSTRING#$PATTERN}  # RESULT: BCCBA
echo ${MYSTRING%$PATTERN}  # RESULT: ABCCB
Run Code Online (Sandbox Code Playgroud)

在这里,它是#$一个bash字符串.


eay*_*kin 9

预期的表达式可能是 $#而不是#$

$# 存储传递给shell程序的命令行参数的数量.

例如:

if [ $# -eq 0 ]; then
   echo "${USAGE}" >&2
   exit 1
fi
Run Code Online (Sandbox Code Playgroud)

如果命令行参数的数量为0,则显示存储在$ USAGE变量中的消息.


gsi*_*011 6

您可能会看到的一个地方#$是更改基数时的算术表达式内: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
}
Run Code Online (Sandbox Code Playgroud)

第一个参数 ( $1) 的格式我不记得是使用awk. 毫秒参数被解析为009, 9 毫秒。但是,bash 将以 0 开头的数字视为八进制,因此我将它们转换为十进制。它并不完全是 using #$,但是当我在一段时间后查看此代码并试图记住发生了什么时,我一开始以为这是一个表达式并发现了这个问题,因此这可能对其他人有所帮助。