我正在try 编写一个bash脚本,允许用户使用通配符传递目录路径.

例如

bash show_files.sh *

在这个目录中执行时

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

将输出:

dir_a
file_b.txt
file_c.sql

它现在的输出方式是:

dir_a

show_files.sh页的内容:

#!/bin/bash

dirs="$1"

for dir in $dirs
do
    echo $dir
done

推荐答案

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

在脚本中,您需要使用:

for dir in "$@"
do
    echo "$dir"
done

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

另见第How to iterate over arguments in a bash shell script页.


可能令人困惑的附录

如果你真的想让脚本扩展*,你必须确保*被传递给脚本(用引号括起来,就像其他答案一样),然后确保它在处理过程中的正确点被扩展(这不是小事).在这一点上,我会使用一个array.

names=( $@ )
for file in "${names[@]}"
do
    echo "$file"
done

我不经常使用没有双引号的$@,但这是一次或多或少正确的做法.棘手的是,它无法很好地处理带有空格的通配符.

考虑:

$ > "double  space.c"
$ > "double  space.h"
$ echo double\ \ space.?
double  space.c double  space.h
$

很好.但是试着把它作为外卡传给 playbook ,然后...好吧,我们就说在这一点上变得很棘手.

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

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

Linux相关问答推荐

通过ssh传输参数时避免字符串拆分

Bash:将多行转换为单行的命令

在 Linux 中屏蔽文件中的位 - 按位运算

为什么组合的查找和重命名命令在 bash shell 下不能按预期工作?

如何使用 sed 和 awk 命令提取模式?

如何摆脱管道分隔字段中不需要的管道符号 - Linux

如何从 AWK 中的 CSV 列中获取中值? (Linux)

用于替换 struct 文档中文本的 Bash 脚本

有没有办法定义自定义隐式 GNU Make 规则?

bash 更有效的方法来转换奇数日期格式以被 linux 日期识别

DMA 和内存映射 IO 有什么区别?

Eclipse 的 C# 插件

如何更改目录中所有文件中所有出现的单词

scp 使用私钥身份验证将目录复制到另一台服务器

如何在 Linux 中通过控制台输出启动 Tomcat?

如何对 /dev/random 或 /dev/urandom 进行 base64 编码?

判断环境变量是否已经设置

CentOS:在 PHP 安装中启用 GD 支持

如何在没有 root 用户的情况下在 Linux (CentOS) 中安装软件包并进行自动依赖处理?

将 BlueZ Stack 用作外设(广告商)