0

我需要一些帮助来为以下场景编写脚本。

要求是,根据(*.cfg)给定目录中配置文件的数量,我需要将所有不带文件扩展名的配置文件名加载到数组中。如果目录中只有一个配置文件,则数组将被赋值""(不是唯一可用配置文件的名称)

我正在尝试使用逻辑运算符来做到这一点。这是我到目前为止所尝试的。

[`ls *.cfg |wc -l`] || code_to_initialize_array;

我的问题是,如何整合我只有一个配置文件的情况。

4

4 回答 4

4

短代码:

#!/bin/bash
array=(*.cfg)
array=("${array[@]%.cfg}")
[ ${#array[@]} -eq 1 ] && array=""
于 2013-09-06T09:30:24.830 回答
2
#!/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
于 2013-09-06T08:46:21.133 回答
0

我一直喜欢for在这种情况下滥用循环。

for x in *.cfg; do
    [[ -f $x ]] && code_to_initialize_array
    break

显式break意味着循环只迭代一次,无论.cfg你有多少文件。如果没有,*.cfg将按字面意思处理,因此在尝试运行之前[[ -f $x ]]检查“第一个”文件是否确实存在。cfgcode_to_initialize_array

于 2013-09-06T12:53:34.280 回答
0

您可以拥有此示例脚本以满足您的要求。它很详细,变量名称很长,但您可以进行自己的自定义。使用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
于 2013-09-06T09:41:28.480 回答