Как создать список буквенных последовательностей в оболочке рыбы

В bash вы можете легко сгенерировать последовательность букв, например, "{a..z}"

$ echo {a..z}
a b c d e f g h i j k l m n o p q r s t u v w x y z

Как сделать это в раковине рыбы вместо этого?

2 ответа

Решение

Fish не поддерживает диапазоны в расширении фигурных скобок, только значения через запятую: {a,b,c},

Таким образом, мы вынуждены искать команду, способную генерировать такую ​​последовательность. Например, вы можете использовать Perl:

for c in (perl -e '$,="\n"; print ("a" .. "z")')
  printf ">> %s\n" "$c"
end

где $, является разделителем выходного поля.

Выход

>> a
>> b
...(skipped)
>> y
>> z

Вы можете найти эту таблицу полезной.

Одним из способов является использование printf и seq.

echo -e (printf '\\\x%x\n' (seq 97 122))

Это работает путем генерации "\x61 \x62 \x63 ... \x7a", который затем интерпретируется "echo -e" как шестнадцатеричные коды символов.

В частности, чтобы сгенерировать последовательность z, которую вы можете использовать в цикле, я думаю, что наиболее элегантным и кратким решением является прямое использование bash с fmt (который доступен в большинстве unix-подобных сред). Вам даже не нужен Perl, и он более читабельный:

for c in (bash -c "echo {a..z}" | fmt -w1)
    echo "hello $c"
end

Логика такая:

  1. Цикл for в оболочке Fish проходит как по значениям массива, так и по строкам. Если вы можете сгенерировать каждый az в отдельной строке, вы можете зациклиться на этом в fish.

  2. Команда bash -c "echo {a..z}" даст вам одну длинную строку в fish:

    a b c d e f g h i j k l m n o p q r s t u v w x y z
    
  3. Команда fmt -w1 разделил бы строки, разделенные пробелами, на строки.

Результат:

hello a
hello b
hello c
... (skipped)
hello z

Это удивительно, потому что вы можете воспользоваться тем же принципом для повторного использования синтаксиса bash в fish. Мне кажется очень гибким:-)

Linux имеет seq Команда для этого, и она работает с fishshell:

$ for f in (seq 1 10)
    echo $f
end
1
2
3
4
5
6
7
8
9
10
$
Другие вопросы по тегам