我想要这样的东西: if [[ "$1" = "*" || "$1" = "全部"]; 然后 cat /etc/passwd elif [ -z $1 ]; 然后 ls /var/log fi 问题是通配符,我不知道用户是否在我的脚本中添加 * 作为参数。任何想法???谢谢
问问题
37 次
2 回答
1
wild() {
if [[ "$1" == '*' ]]
then echo "wildcard"
else echo "no wildcard"
fi
}
$ wild abc
no wildcard
$ wild *
no wildcard
$ wild '*'
wildcard
$ wild \*
wildcard
于 2022-02-25T14:45:06.167 回答
1
当有人从命令提示符/shell 调用您的脚本时,该 shell 已经进行了通配符扩展,而您的脚本甚至看不到通配符。您的脚本无法区分
wild.sh 1 2 3 4 5 6 7 8 9
和
wild.sh ?
在文件名从 1 到 9 的目录中;您的脚本接收已扩展的文件名。
保留通配符的方法有:
如果模式不匹配,则按原样传递,例如,
*.txt
如果没有以.txt
如果调用者将通配符放在引号中或用反斜杠转义它们,它们将不会被扩展:
wild.sh "*.txt"
或wild.sh '*.txt'
或wild.sh \*.txt
如果您从另一个程序调用您的脚本并且不涉及外壳程序(例如,Java 的
ProcessBuilder
),那么您将按原样获取带有任何通配符的参数。
如果您想检查是否有人传递了未扩展的通配符,您还需要在代码中引用它们,顺便说一句:
if [ "$1" == * ]
then
echo ...
fi
如果您再次在文件名为 1 到 9 的目录中运行它,它将扩展为
if [ "$1" == 1 ]
then
echo ...
fi
(以及$2
2、3$3
等等),这可能不是您想要的,所以再次引用或转义通配符:
if [ "$1" == "*" ] # or == '*'
then
echo ...
fi
于 2022-02-25T16:10:00.413 回答