如何在 bash 中为带有星号“*”的路径使用变量?
How to use a variable for a path with an astertik "*" in bash?
我的变量有问题,内容是带星号的路径。
示例:
- ./script
- /配置
- /导出
- /家/*
#!/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=("$@")
我的变量有问题,内容是带星号的路径。
示例:
- ./script
- /配置
- /导出
- /家/*
#!/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=("$@")