
Я использую Fish версии 3.7.0 и хочу написать функцию для удаления элементов из списков на основе их индекса.
Например, я хочу удалить элемент из переменной среды PATH с индексом 2:
set -l variable_name PATH
set -l index 2
set -e $variable_name[$index]
Однако следующий оператор не работает, он возвращает:
установить: --erase: опция требует аргумента
Я вижу, что для получения имени переменной (например, PATH) требуются некоторые ленивые вычисления, но я не понял, как это сделать.
решение1
Проблема в том, что fish принимает $var[$foo]
как «элемент footh $var», тогда как вы хотите «расширить $var, расширить $foo и присоединить оба вместе».
Вы можете использовать различные способы выразить то, что вы хотите, но, пожалуй, самый понятный из них:
set -e $variable_name[1][$index]
Это расширит первый элемент $variable_name ("PATH"), другой []
не будет синтаксически специальным, поэтому в итоге будет выполнено
set -e PATH[2]
Как ты хочешь.
Альтернативы включают кавычки ( set -e "$variable_name"[$index]
), раскрытия фигурных скобок ( set -e {$variable_name}[$index]
) - вам действительно нужно просто отделить $var
от [$foo]
части. Даже установка индекса на [2]
и использование set -e $variable_name$index
работает.