【问题标题】:Can't pass /bin/*无法通过 /bin/*
【发布时间】:2017-10-02 21:43:38
【问题描述】:

我正在尝试使用简单的 shell 脚本传递 a 以用目录列表填充数组。但是,当我将/bin/* 作为第一个参数$1 传递到程序中时,转到/bin/bash(/bin 中的第一个目录)。我的代码如下供参考。我不能在参数中传递* 吗?

#!/bin/bash

declare -a d
placeholder=0

for filename in ${1}; do
     d[${placeholder}]=${filename:5}
     ((placeholder++))
 done

echo "$1"

回显的结果是/bin/bash

谢谢!

【问题讨论】:

    标签: bash shell


    【解决方案1】:

    glob 被 shell 替换为与其匹配的名称列表。

    利用这一点,阅读参数列表中传递的名称列表:

    #!/bin/bash
    
    declare -a d
    placeholder=0
    
    for filename in "$@"; do               # or just ''for filename; do''
         d[${placeholder}]=${filename:5}
         ((placeholder++))
    done
    
    # print your array
    declare -p d
    
    # or, to print your array's contents one entry per line:
    printf '%s\n' "${d[@]}"
    

    ...或者,更简单:

    #!/bin/bash
    d=( "${@##*/}" )           # assuming the :5 is intended to leave only filenames
    declare -p d
    

    【讨论】:

      【解决方案2】:

      * 在调用您的脚本之前被 shell 扩展。尝试调用 yourscript '/bin/*'(注意引号)。

      【讨论】:

      • 感谢工作!请问您所说的“扩展”是什么意思?
      • 搜索“bash expand glob”,你会得到很多有用的信息。
      • 这是个坏建议。如果 OP 试图搜索 "prefix with spaces"*.txt,它将完全失败(他们的 for filename in $1 将首先迭代 prefix,然后是 with,然后是扩展 glob 的结果 spaces*.txt)。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-21
      • 1970-01-01
      • 2012-02-05
      • 1970-01-01
      • 2012-12-21
      相关资源
      最近更新 更多