gpt4 book ai didi

linux - 如何将通配符参数传递给 bash 文件

转载 作者:太空宇宙 更新时间:2023-11-04 12:05:19 25 4
gpt4 key购买 nike

我正在尝试编写一个允许用户使用通配符传递目录路径的 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

最佳答案

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

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

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

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

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


可能令人困惑的附录

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

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

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

考虑:

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

这很好用。但是尝试将其作为通配符传递给脚本,然后......好吧,我们只能说这在这一点上变得很棘手。

如果你想单独提取$2,那么你可以使用:

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

关于linux - 如何将通配符参数传递给 bash 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50946475/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com