【问题标题】:What does #$ do in bash? (aka: Hash dollar sign, pound dollar sign)#$ 在 bash 中做了什么? (又名:哈希美元符号,英镑美元符号)
【发布时间】:2012-03-26 16:14:03
【问题描述】:

我在 bash 脚本中遇到了这个表达式,用 google 搜索真的不容易。

#$...

感谢您的帮助!

【问题讨论】:

  • 如果 #$ 不是拼写错误,则 AFAIK 是注释行,如果您的意思是 $#,则它是传递给脚本或函数的参数数量
  • 附上你找到它的网站怎么样?
  • 尝试搜索“dollar pound”或“pound dollar”,这就是我找到此页面的方法(Google 的第一个结果)。

标签: bash shell


【解决方案1】:

#$“什么都不做”,因为# 正在开始注释,并且它后面在同一行的所有内容都将被忽略("shebang" 除外)。

$#,正如您所拥有的,打印传递给 shell 脚本的参数数量(如 $* 打印所有参数)。

【讨论】:

    【解决方案2】:

    我刚刚在脚本中遇到了 #$ 并且想知道同样的事情。有一个尚未提及的答案:In bash search and replace (see here)。

    通常,它是这样工作的:

    ${PARAMETER/PATTERN/STRING}
    

    PATTERN 还可以包含 anchors,以匹配它的开头或结尾;即#%

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

    【讨论】:

      【解决方案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 开头的数字视为八进制,因此我将它们转换为十进制。不完全是在使用#$,但是当我在一段时间后查看这段代码并试图记住发生了什么时,我一开始以为这是一个表达式并发现了这个问题,所以这可能对其他人有帮助。

      【讨论】:

      • 很有趣,即使 SO 也无法正确显示。它也无法在 github 上正确显示。不过在 Sublime Text 中看起来不错。
      • 我在我的 zsh 存储库中找到了 this function,但我无法理解以下语法在做什么 ord=$(( [##16] #byte ))。我认为它与上述类似,但想确切地知道发生了什么。我猜是base16转换?
      【解决方案4】:

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

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

      例如:

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

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

      【讨论】:

        【解决方案5】:

        在 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 中找到的用例。谢谢。
        猜你喜欢
        • 2011-11-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-12-21
        • 2010-12-14
        • 2015-08-05
        • 1970-01-01
        相关资源
        最近更新 更多