我有以下数组:
SPECIFIC_FILES=('resources/logo.png' 'resources/splash.png' 'www/img/logo.png' 'www/manifest.json')
以及以下变量:
CUSTOMER=default
如何遍历数组并生成看起来像这样的字符串
resources/logo_default.png
取决于变量。
答案 0 :(得分:3)
下面使用parameter expansion提取相关的子字符串,如BashFAQ #100中所述:
specific_files=('resources/logo.png' 'resources/splash.png' 'www/img/logo.png' 'www/manifest.json')
customer=default
for file in "${specific_files[@]}"; do
[[ $file = *.* ]] || continue # skip files without extensions
prefix=${file%.*} # trim everything including and after last "."
suffix=${file##*.} # trim everything up to and including last "."
printf '%s\n' "${prefix}_$customer.$suffix" # concatenate results of those operations
done
此处小写的变量名与POSIX-specified conventions保持一致(全大写字母的名称用于对操作系统或shell有意义的变量,而保留至少一个小写字符的变量供应用程序使用用途;设置常规的shell变量会覆盖任何名称相同的环境变量,因此约定适用于两个类。
答案 1 :(得分:1)
这是sed
的解决方案:
for f in "${SPECIFIC_FILES[@]}"; do
echo "$f" | sed "s/\(.*\)\.\([^.]*\)/\1_${CUSTOMER}.\2/p"
done
答案 2 :(得分:1)
如果您知道每个文件名只有一个句点,则可以直接在每个元素上使用扩展名:
$ printf '%s\n' "${SPECIFIC_FILES[@]/./_"$CUSTOMER".}"
resources/logo_default.png
resources/splash_default.png
www/img/logo_default.png
www/manifest_default.json
如果不这样做,查尔斯的答案就是涵盖所有情况的可靠答案。