2012-03-09 101 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字符串中的#$