我正在尝试编写一个脚本,让我在运行脚本时获取参数。我可以使用脚本中的 $@ 来实现这一点。但如果我使用/*
或运行脚本,它会给出或*/*
中所有目录的列表。/*
*/*
我希望在脚本中获取变量的值,/*
如果*/*
使用的话;而不是/*
在运行脚本时获取其中的所有目录和文件。
我知道问题出在 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 *.