Bash Can';t通行证/垃圾箱/*

Bash Can';t通行证/垃圾箱/*,bash,shell,Bash,Shell,我试图通过一个简单的shell脚本传递一个命令,用目录列表填充数组。但是,当我将/bin/*作为第一个参数$1传递到程序中时,请转到/bin/bash(在/bin中的第一个目录)。下面是我的代码供参考。我不能在参数中传递* #!/bin/bash declare -a d placeholder=0 for filename in ${1}; do d[${placeholder}]=${filename:5} ((placeholder++)) done echo

我试图通过一个简单的shell脚本传递一个命令,用目录列表填充数组。但是,当我将
/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


谢谢

*
正在由shell在调用脚本之前进行扩展。尝试以
yourscript'/bin/*'
的身份调用(注意引号)。

一个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

谢谢你,真管用!我可以问一下“扩展”是什么意思吗?搜索“bash expand glob”,你会得到很多有用的信息。这是个糟糕的建议。如果OP试图搜索
“带空格的前缀”*.txt
,它将彻底失败(他们对$1中文件名的
将首先迭代
前缀
,然后迭代
带空格
,然后是扩展全局
空格*.txt
)的结果)。