Мне не совсем понятна реальная цель, но в зависимости от ситуации я вижу несколько возможных решений. Лучшее (если это сработает в данной ситуации) - обойтись без отдельных переменных и просто использовать записи массива. Например, вы можете использовать:
declare -a filepath
filepath[1]="filepath1/file1"
filepath[2]="filepath2/file2/"
for index in "${!filepath[@]}"; do
if [[ "${filepath[index]}" = *?/ ]]; then
filepath[index]="${filepath[index]%/}"
fi
done
... и затем использовать "${filepath[x]}"
вместо "$FILEPATHx"
повсюду. Некоторые примечания:
- Я использовал строчные имена. Как правило, лучше избегать имен всех заглавных букв, поскольку их много со специальными функциями, и случайное использование одного из этих имен может вызвать проблемы.
"${!filepath[@]}"
получает список индексов массива (в данном случае «1», «2»), а не их значения; это необходимо, чтобы мы могли устанавливать записи, а не просто просматривать их. - Я изменил логи c теста sla sh -trimming - он использует
[[ = ]]
сделать сопоставление с шаблоном, чтобы увидеть, заканчивается ли запись символом "/" и имеет по крайней мере один символ перед этим (то есть это не просто"/", потому что вы не хотите обрезать который). Затем он использует в расширении %/
, чтобы просто обрезать "/" от конца значения.
Если массив с числовым индексированием не будет работать (и у вас есть по крайней мере bash версия 4), как насчет массива с индексированной строкой ("ассоциативный")? Это очень похоже, но используйте declare -A
и используйте $
для переменных в индексе (и обычно их заключайте в кавычки). Примерно так:
declare -A filepath
filepath["foo"]="filepath1/file1"
filepath["bar"]="filepath2/file2/"
for index in "${!filepath[@]}"; do
if [[ "${filepath["$index"]}" = *?/ ]]; then
filepath["$index"]="${filepath["$index"]%/}"
fi
done
Если вам действительно нужны отдельные переменные вместо записей массива, вы можете использовать массив переменных names и косвенные ссылки на переменные. как это работает варьируется между различными оболочками и может быть небезопасным в зависимости от того, что находится в ваших данных (в данном случае, в частности, от path_array
). Вот способ сделать это в bash:
filepath1="filepath1/file1"
filepath2="filepath2/file2/"
path_array=(filepath1 filepath2)
for varname in "${path_array[@]}"; do
if [[ "${!varname}" = *?/ ]]; then
declare "$varname=${!varname%/}"
fi
done