如何在 bash 中为带有星号“*”的路径使用变量?

How to use a variable for a path with an astertik "*" in bash?

我的变量有问题,内容是带星号的路径。

示例:

#!/bin/bash
#
dir=()
for i in $@; do
dir+="$i"
done

这个变量来自启动脚本时的用户输入。 但是一旦我使用这个变量,bash 就会将 /home/* 扩展到 /home.

下的所有文件夹

我想用测试语句检查变量,如果有星号则 运行 命令。

for i in ${dir[*]}; do
  if [[ "$i" == *"*"* ]]; then find $i -maxdepth 1 -type d
  fi
done

您是否知道如何正确地完成它,或者建议如何通过不同的方式来避免这种情况???

大多数变量扩展(极少数例外)应该用双引号引起来。然后你可以处理(几乎)任意参数。两个随机示例:

check_asterisk_v1() {
  local a
  for a in "$@"; do
    [[ "$a" == *'*'* ]] &&
        echo "argument '${a}' contains an asterisk"
  done
  echo "${#} arguments in total"
}

check_asterisk_v2() {
  local -ar args=("$@")
  local -i i
  for i in "${!args[@]}"; do
    [[ "${args[i]}" == *'*'* ]] &&
        echo "$((i + 1)). argument '${args[i]}' contains an asterisk"
  done
  echo "${#args[@]} arguments in total"
}

check_asterisk_v1 a '*' b '**' c '***' d
check_asterisk_v2 a '*' b '**' c '***' d

附带说明一下,我要指出您的 for-cycle 看起来不对。这会将字符串附加到数组 dir 的第一个元素(索引 0)(这没有多大意义):

dir=()
for i in "$@"; do dir+="$i"; done

这会将元素附加到数组 dir(您可能确实打算这样做):

dir=()
for i in "$@"; do dir+=("$i"); done

这是获得相同结果的更简单方法:

dir=("$@")