我需要一些帮助来为以下场景编写脚本。
要求是,根据(*.cfg)
给定目录中配置文件的数量,我需要将所有不带文件扩展名的配置文件名加载到数组中。如果目录中只有一个配置文件,则数组将被赋值""
(不是唯一可用配置文件的名称)
我正在尝试使用逻辑运算符来做到这一点。这是我到目前为止所尝试的。
[`ls *.cfg |wc -l`] || code_to_initialize_array;
我的问题是,如何整合我只有一个配置文件的情况。
短代码:
#!/bin/bash
array=(*.cfg)
array=("${array[@]%.cfg}")
[ ${#array[@]} -eq 1 ] && array=""
#!/bin/bash
config=(*.cfg) #glob instead ls usage
num=${#config[@]}
case $num in
0)
echo "No config file"
;;
1)
echo "Only one config file"
;;
*)
code_to_initialize_array
;;
esac
我一直喜欢for
在这种情况下滥用循环。
for x in *.cfg; do
[[ -f $x ]] && code_to_initialize_array
break
显式break
意味着循环只迭代一次,无论.cfg
你有多少文件。如果没有,*.cfg
将按字面意思处理,因此在尝试运行之前[[ -f $x ]]
检查“第一个”文件是否确实存在。cfg
code_to_initialize_array
您可以拥有此示例脚本以满足您的要求。它很详细,变量名称很长,但您可以进行自己的自定义。使用readarray
比使用更安全,A=($(...))
因为它不依赖IFS
且不受路径名扩展的影响。
#!/bin/bash
DIR=/path/to/somewhere
readarray -t FILES < <(compgen -G "${DIR%/}/*.cfg") ## Store matches to array.
FILES_COUNT=${#FILES[@]} ## Match count.
FILES_NAMES=("${FILES[@]##*/}") ## No directory parts.
FILES_NAMES_WITHOUT_CFG=("${FILES_NAMES[@]%.cfg}") ## No .cfg extension.
if [[ FILES_COUNT -gt 0 ]]; then
printf "File: %s\n" "${FILES[@]}"
printf "Name: %s\n" "${FILES_NAMES[@]}"
printf "Name (no .cfg): %s\n" "${FILES_NAMES_WITHOUT_CFG[@]}"
printf "Total: %d\n" "$FILES_COUNT"
fi
请注意,每个条目都有相同的索引号。${FILES[1]}
也是如此。${FILES_NAMES[1]}
_ ${FILES_NAMES_WITHOUT_CFG[1]}
条目以 index 开头0
。
您还可以通过以下方式获得其他详细信息:
if [[ FILES_COUNT -gt 0 ]]; then
for I in "${!FILES[@]}"; do
printf "File: %s\n" "${FILES[I]}"
printf "Name: %s\n" "${FILES_NAMES[I]}"
printf "Name (no .sh): %s\n" "${FILES_NAMES_WITHOUT_CFG[I]}"
printf "Index number: $I\n\n"
done
printf "Total: %d\n" "$FILES_COUNT"
fi