我的变量有问题,其内容是带有星号的路径。
示例:
#!/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 循环看起来是错误的。这会将字符串附加到数组
0
的第一个元素(索引 dir
)(这没有多大意义):
dir=()
for i in "$@"; do dir+="$i"; done
这会将元素附加到数组
dir
(您可能实际上打算这样做):
dir=()
for i in "$@"; do dir+=("$i"); done
这是达到相同结果的更简单方法:
dir=("$@")