Для повторения каждого символа строки в ksh93
, bash
илиzsh
:
string=whatever
for ((i = 0; i < ${#string}; i++)); do
printf '%s\n' "Character $((i + 1)): ${string: i:1}"
done
Вzsh
(то же, что и в yash
, за исключением того, что yash
не поддерживает синтаксис for ((...))
), см. также:
for ((i = 1; i <= ${#string}; i++)); do
printf '%s\n' "Character $i: $string[i]"
done
Или с помощьюs
(флага расширения параметра разделения)с пустой строкой в качестве разделителя:
for c (${(s"")string}) something with "$c"
Для преобразования символа в строку вы должны использовать либо конструкцию case
, например:
case $c in
(A) s='{O.O}';;
(a) s='{q-p}';;
...
esac
Или ассоциативный массив:
zsh
:
typeset -A map
map=(
A '{O.O}'
a '{q-p}'
...
)
s=$map[$c]
ksh93
/bash
:
typeset -A map
map=(
[A]='{O.O}'
[a]='{q-p}'
...
)
s=${map[$c]}
Переносимо (со стандартным sh
синтаксисом ), вы также можете сделать:
map='|A={O.O}|a={q-p}|...'
s=${map#*"|$c="}
s=${s%%"|"*}
(при условии, что ни одна из строк не содержит |
символов ).
Или вы также можете вызвать соответствующую утилиту обработки текста -(использовать оболочку для вызова команд, поскольку она предназначена для этого, и утилиту обработки текста для обработки текста ).
STRING=whatever awk -F= '{map[$1] = $2}
END {
s = ENVIRON["STRING"]
l = length(s)
for (i = 1; i <= l; i++) {
c = substr(s, i, 1)
print map[c]
}
}' << EOF
A={O.O}
a={q-p}
...
EOF
(однако имейте в виду, что некоторые реализации awk
, такие как mawk
, поддерживают только одиночные -байтовые символы ).
Я также очень сбит с толку, увидев dirmngr
как шаблон, который вы искали.
1. Однако, если у вас есть .deb
файл, который вы установили, но не знаете, какому фактическому пакету он соответствует, вы можете запустить dpkg-deb -W
.
Для иллюстрации на примере epson-printer-utility_1.0.2.deb
:
$ ls *.deb
epson-printer-utility_1.0.2.deb
$ sudo dpkg-deb -W epson-printer-utility_1.0.2.deb
epson-printer-utility 1.0.2-1lsb3.2
2. Что интересно, так это то, что пытаться выяснить, какой пакет был установлен из оригинального имени файла.deb, никогда не бывает хорошей идеей, потому что если вы просто сделаете копию и дадите ей другое имя:
$ cp epson-printer-utility_1.0.2.deb abcde.deb
$ sudo dpkg-deb -W abcde.deb
epson-printer-utility 1.0.2-1lsb3.2
3. И, наконец, если вы когда-нибудь захотите найти всю информацию из данного.deb, и особенно если у вас уже установлен этот конкретный пакет, вы можете запустить sudo dpkg-query -s [package name given by dpkg-deb]
или за один шаг (заменить «abcde. deb" вашим файлом.deb, поставьте "", если в нем есть пробелы):
sudo dpkg-query -s $(dpkg-deb -f abcde.deb | grep "Package" | cut -d: -f2)
Package: epson-printer-utility
Status: install ok installed
Priority: extra
Section: alien
Installed-Size: 10652
Maintainer: Seiko Epson Corporation <linux-printer@epson.jp>
Architecture: amd64
Version: 1.0.2-1lsb3.2
Depends: lsb (>= 3.2)
Description: Epson Printer Utility for Linux
Для финальной команды можно "обычно" также использовать немного укороченную версию:
dpkg-query -s $(dpkg-deb -W abcde.deb |cut -f1)
до тех пор, пока кто-то не сойдет с ума и не создаст пакет с [TAB]
вставленным в имя, потому что с CTRL+VTAB имя файла действительно может быть сделано выглядеть вот так:
$ cp abcde.deb "abc de.deb"
$ ls
'abc'$'\t''de.deb' abcde.deb
Тем не менее, он по-прежнему будет работать так, как задумано:
$ dpkg-deb -W 'abc'$'\t''de.deb'
epson-printer-utility 1.0.2-1lsb3.2