Bash Can';t通行证/垃圾箱/*
我试图通过一个简单的shell脚本传递一个命令,用目录列表填充数组。但是,当我将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
/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
)的结果)。