How do I pass a wildcard parameter to a bash file

eis*_*son 31 linux parameters bash wildcard

I'm trying to write a bash script that allows the user to pass a directory path using wildcards.

For example,

bash show_files.sh *
Run Code Online (Sandbox Code Playgroud)

when executed within this directory

drw-r--r--  2 root root  4.0K Sep 18 11:33 dir_a
-rw-r--r--  1 root root   223 Sep 18 11:33 file_b.txt
-rw-rw-r--  1 root root   106 Oct 18 15:48 file_c.sql
Run Code Online (Sandbox Code Playgroud)

would output:

dir_a
file_b.txt
file_c.sql
Run Code Online (Sandbox Code Playgroud)

The way it is right now, it outputs:

dir_a
Run Code Online (Sandbox Code Playgroud)

contents of show_files.sh:

#!/bin/bash

dirs="$1"

for dir in $dirs
do
    echo $dir
done
Run Code Online (Sandbox Code Playgroud)

Jon*_*ler 47

父shell,一个调用bash show_files.sh *,扩展*为您.

在您的脚本中,您需要使用:

for dir in "$@"
do
    echo "$dir"
done
Run Code Online (Sandbox Code Playgroud)

双引号可确保正确处理文件名中的多个空格等.

另请参见如何在bashshell脚本中迭代参数.


可能令人困惑的附录

如果你真的确定要让脚本扩展*,你必须确保*将脚本传递给脚本(用引号括起来,就像在其他答案中一样),然后确保它在正确的点上展开在处理中(这不是微不足道的).那时,我会使用一个数组.

names=( $@ )
for file in "${names[@]}"
do
    echo "$file"
done
Run Code Online (Sandbox Code Playgroud)

我不经常使用$@没有双引号,但这是一次或多或少是正确的事情.棘手的部分是它不能很好地处理带空格的外卡.

考虑:

$ > "double  space.c"
$ > "double  space.h"
$ echo double\ \ space.?
double  space.c double  space.h
$
Run Code Online (Sandbox Code Playgroud)

这很好.但是尝试将它作为一张外卡传递给脚本......好吧,我们只是说它在那时变得棘手.

如果要$2单独提取,则可以使用:

names=( $1 )
for file in "${names[@]}"
do
    echo "$file"
done
# ... use $2 ...
Run Code Online (Sandbox Code Playgroud)

  • @eisaacson如果second_param先来,你可以做`sparam = $ 1; 转移;`然后使用`$ @`. (3认同)
  • 抱歉; 这不是意图.传递外卡并不是一个好主意,部分原因是它让一切都变得非常混乱.让shell自然地处理它.在您的设计中,首先传递'second'参数,并将'文件/目录列表'作为参数的其余部分.这是Unix的自然设计.我建议尽可能使用它. (3认同)

che*_*ner 10

引用外卡:

bash show_files.sh '*'
Run Code Online (Sandbox Code Playgroud)

或者让你的脚本接受一个参数列表,而不只是一个:

for dir in "$@"
do
    echo "$dir"
done
Run Code Online (Sandbox Code Playgroud)

最好直接迭代"$@'而不是将其分配给另一个变量,以保持其保存自身包含空格的元素的特殊能力.

  • 对我来说,第一个选择是完美的。我需要将参数传递给另一个自行处理通配符的脚本。 (2认同)