2012-03-09 32 views
25

我在bash脚本中遇到了这个表达式,这对谷歌来说确实不容易。

#$... 

感谢您的帮助!

+1

http://superuser.com/questions/247127/what-is-and-in-linux – Corbin 2012-03-09 07:08:47

+1

如果#$不是拼写错误,那么AFAIK就是注释行,如果你的意思是$#那么它的数量是传递给脚本或函数的参数 – 2012-03-09 07:11:01

+0

您确定它不是评论? – 2012-03-09 07:13:54

回答

31

#$确实“没有”,因为#正在开始评论,并且在同一行后面的所有内容都被忽略(除了"shebang"的显着例外)。

$#,因为您已经打印了传递给shell脚本的参数数量(如$*打印所有参数)。

12

在bash中这通常是一个注释,散列之后的所有内容(在同一行)都被忽略。 但是,如果你的bash脚本被传递给不寻常的东西,它可以被解释。例如,如果您将脚本提交给Sun Grid Engine: “任何以散列美元开头的行,即#$,都是特殊注释,SGE可以理解这些注释以指定关于如何或在何处在这种情况下,我们指定作业将运行的目录(#$ -cwd)和作业将加入的队列(#$ -q serial.q)。“ (来源:http://talby.rcs.manchester.ac.uk/~rcs/_linux_and_hpc_lib/sge_intro.html

+1

这是我在SGE中找到的用例。谢谢。 – 2016-11-01 19:44:58

+0

这是真正的答案,应该接受 – zhouji 2017-09-19 15:47:48

8

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

$#商店被传递到外壳,命令行参数的个数程序。

例如:

if [ $# -eq 0 ]; then 
    echo "${USAGE}" >&2 
    exit 1 
fi 

显示存储在$用法变量的消息,如果命令行参数的个数为0

3

一个地方,你可能会看到#$拿出里面有个换算基数时的算术表达式:http://www.gnu.org/software/bash/manual/bashref.html#Shell-Arithmetic

例如echo $((2#101))会将101转换为基数2,并打印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开头的数字视为八进制数,所以我将它们转换为十进制数。它并不完全使用#$,但是当我在一段时间后查看此代码并试图记住发生了什么时,我认为这是一个表达式,并且发现了这个问题,因此这可能会帮助其他人。

+0

有趣的是,即使是SO也无法正确显示。它也不能正确显示在github上。尽管在Sublime Text中看起来很好。 – gsingh2011 2013-08-30 00:08:53

7

我刚刚遇到了一个脚本中的#$,并想知道同样的事情。还有没有提到的答案:在bash搜索和替换(见here)。

通常情况下,它的工作原理是这样的:

${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字符串中的#$