Как создать список буквенных последовательностей в оболочке рыбы
В 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
Логика такая:
Цикл for в оболочке Fish проходит как по значениям массива, так и по строкам. Если вы можете сгенерировать каждый az в отдельной строке, вы можете зациклиться на этом в fish.
Команда
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
Команда
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
$