Вот более простой скрипт для импорта псевдонимов bash в fish. Создайте файл fish_import_bash_aliases.fish
в папке ~/.config/fish/functions
со следующим содержимым.
function fish_import_bash_aliases \
--description 'import bash aliases to.fish function files.'
for a in (cat ~/.bash_aliases | grep "^alias")
set aname (echo $a | sed 's/alias \(.*\)=\(\'\|\"\).*/\1/')
set command (echo $a | sed 's/alias \(.*\)=\(\'\|\"\)\(.*\)\2/\3/')
if test -f ~/.config/fish/functions/$aname.fish
echo "Overwriting alias $aname as $command"
else
echo "Creating alias $aname as $command"
end
alias $aname $command
funcsave $aname
end
end
После того, как файл скрипта будет готов, запустите fish_import_bash_aliases
в оболочке fish, которая создаст скрипт функции fish для каждого псевдонима bash в ~/.config/fish/functions
.
Я предполагаю, что 0
в ваших примерах означает «любая одиночная цифра», а XYZ
— «любая строка из трех букв верхнего -регистра». В приведенном ниже коде также предполагается локаль POSIX.
#!/bin/sh
for string do
case $string in
([0-9][0-9][0-9][0-9]-[A-Z][A-Z][A-Z])
printf '"%s" looks like a number plate\n' "$string"
;;
([0-9][0-9][0-9]-[0-9][0-9][0-9][0-9])
printf '"%s" looks like a Zip-code\n' "$string"
;;
(*)
printf 'Cannot determine what "%s" is\n' "$string"
esac
done
При этом используются шаблоны подстановки для сопоставления каждой из заданных строк и определения ее типа или невозможности определения ее типа. Строки задаются в командной строке скрипта.
Тестирование:
$./script 1234-ABC 234-2345 AAA-BB
"1234-ABC" looks like a number plate
"234-2345" looks like a Zip-code
Cannot determine what "AAA-BB" is
Использование регулярных выражений в bash
вместо:
#!/bin/bash
for string do
if [[ $string =~ ^[0-9]{4}-[A-Z]{3}$ ]]; then
printf '"%s" looks like a number plate\n' "$string"
elif [[ $string =~ ^[0-9]{3}-[0-9]{4}$ ]]; then
printf '"%s" looks like a Zip-code\n' "$string"
else
printf 'Cannot determine what "%s" is\n' "$string"
fi
done
(Вывод такой же, как и выше, с теми же аргументами командной строки.)
Вы можете использовать регулярное выражение в сценарии bash. например:
#!/bin/bash
car_plate="0000-0000"
if [[ $car_plate =~ ^[0-9-]+$ ]]; then
echo "standard"
elif [[ $car_plate =~ ^[0-9]+-[a-zA-Z]+$ ]]; then
echo "japanese"
fi
Я сделал сценарий. Надеюсь, я вас правильно понял
#! /bin/bash
for plate do
[[ $plate =~ ^[0-9]{3}-[0-9]{4}$ ]] && echo "$plate : Japanese Plate" && continue
[[ $plate =~ ^[0-9]{4}-[A-Z]{3}$ ]] && echo "$plate : Normal Plate" && continue
echo "$plate : INVALID INPUT"
done
Очень просто и воспроизводимо.
Я хотел бы заявить, что я УЖАСНО кодирую, bash не исключение. Воспринял это как вызов, чтобы попытаться немного улучшить свои навыки.
НЕСКОЛЬКО КЛЕММ ВЫХОДОВ:
INPUT: bash testfindnew.sh 000-1234 0000-XYZ 000-00000 0000-XYZZ
OUTPUT: 000-1234 : Japanese Plate
0000-XYZ : Normal Plate
000-00000 : INVALID INPUT
0000-XYZZ : INVALID INPUT