我有一个变量的问题,内容是带星号的路径。
例子:
#!/bin/bash
#
dir=()
for i in $@; do
dir+="$i"
done
此变量来自启动脚本时的用户输入。但是一旦我使用这个变量,bash 就会扩展/home/*
到 .bashrc 下的所有文件夹/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 看起来是错误的。这将字符串附加到0
数组的第一个元素(索引)dir
(这没有多大意义):
dir=()
for i in "$@"; do dir+="$i"; done
这会将元素附加到数组dir
(您可能实际上打算这样做):
dir=()
for i in "$@"; do dir+=("$i"); done
这是实现相同结果的更简单方法:
dir=("$@")
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句