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

问题描述 投票:0回答:1

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

示例:

  • ./脚本
  • /配置
  • /导出
  • /主页/*
#!/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

您知道如何正确执行此操作吗?或者建议如何通过不同的方式来避免这种情况???

bash variables path
1个回答
1
投票

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

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 循环看起来是错误的。这会将字符串附加到数组

0
的第一个元素(索引
dir
)(这没有多大意义):

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

这会将元素附加到数组

dir
(您可能实际上打算这样做):

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

这是达到相同结果的更简单方法:

dir=("$@")
© www.soinside.com 2019 - 2024. All rights reserved.