如何将 /* 或 */* 解析为 bash shell 脚本

如何将 /* 或 */* 解析为 bash shell 脚本

我正在尝试编写一个脚本,让我在运行脚本时获取参数。我可以使用脚本中的 $@ 来实现这一点。但如果我使用/*或运行脚本,它会给出或*/*中所有目录的列表。/**/*

我希望在脚本中获取变量的值,/*如果*/*使用的话;而不是/*在运行脚本时获取其中的所有目录和文件。

我知道问题出在 Linux 获取与“*”关联的值的方式上。但尚未找到解决方案。

以下是示例脚本:

#!/bin/bash
int_v=0
get_str="$@"
for f in $get_str
do
if [ "$f" == "/*" ] || [ "$f" == "*/*" ] || [ "$f" == "/" ] || [ "$f" == "/boot" ] || [ "$f" == "/bin" ] || [ "$f" == "/root" ] || [ "$f" == "/dev" ] || [ "$f" == "/etc" ] || [ "$f" == "/sbin" ] || [ "$f" == "/home" ] || [ "$f" == "/mnt" ] || [ "$f" == "/sys" ] || [ "$f" == "/tmp" ] || [ "$f" == "/usr" ] || [ "$f" == "/var" ] || [ "$f" == "/proc" ];
then
int_v=1
else
int_v=0
fi
echo $f
done
if [ $int_v == 1 ];
then
echo "Cannot run it with the use of: */* or /* or /. "
else
echo "This script can run"
fi

还在脚本中添加了一个解决方法:由于/*是根目录;我为 /bin, /root... 添加了 if 语句。这可行,但问题在于*/*

有人知道我们如何解析运行脚本时使用的实际变量,而不是脚本的输出吗?

答案1

从 shell 运行脚本时,shell 会在脚本运行前扩展通配符(请参阅路径名扩展在 中man bash)。因此,脚本永远不会看到*/*,它已经看到了所有扩展的文件。

要将通配符表达式逐字传递给脚本,请将其引用或反斜杠化:

myscript.sh '*/*'
myscript.sh \*/\*

如果要防止通配符扩展,则需要正确地用双引号括住所有包含通配符表达式的变量,因为变量扩展发生在路径名扩展之前(请参阅扩张man bash)。

a=*        # No expansion, assignments are special.
echo $a    # Expands the wildcard.
echo "$a"  # Outputs *.

相关内容