0

我想要这样的东西: if [[ "$1" = "*" || "$1" = "全部"]; 然后 cat /etc/passwd elif [ -z $1 ]; 然后 ls /var/log fi 问题是通配符,我不知道用户是否在我的脚本中添加 * 作为参数。任何想法???谢谢

4

2 回答 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

(以及$22、3$3等等),这可能不是您想要的,所以再次引用或转义通配符:

if [ "$1" == "*" ]   # or == '*'
then 
    echo ...
fi
于 2022-02-25T16:10:00.413 回答