С этим файлом шаблона:
a*c=abc
def=def
и при условии, что существует только один =
на строку:
#! /bin/bash
line=abc
while IFS= read -r patternline; do
[[ $patternline =~ .=. ]] || continue
pattern="${patternline%=*}"
result="${patternline##*=}"
if [[ "$line" == $pattern ]]; then
ret="$result"
echo "$patternline"
break
fi
done <patterns.txt
Если необходимо проверить много строк, то однако содержимое файла будет считано в массив:
#! /bin/bash
patterns_file="patterns.txt"
patterns=()
results=()
patternindex=0
### BEGIN: init
while IFS= read -r patternline; do
[[ $patternline =~ .=. ]] || continue
patterns[patternindex]="${patternline%=*}"
results[patternindex]="${patternline##*=}"
((patternindex++))
done <"$patterns_file"
pattern_count="$patternindex"
### END: init
patterncheck () {
local line="$1" i=0 pattern= result=
for((i=0;i<pattern_count;i++)); do
pattern="${patterns[i]}"
result="${results[i]}"
if [[ "$line" == $pattern ]]; then
ret="$result"
echo "$line"
break
fi
done
} # patterncheck ()
# tests
patterncheck abc
patterncheck def
У меня в личном архиве есть скрипт, который делает именно это. Точнее, он извлекает, например. Spain.rar
в новый каталог с именем Spain
, за исключением того, что если все файлы в Spain.rar
уже находятся в одном и том же каталоге верхнего уровня -, тогда этот каталог верхнего уровня -сохраняется.
#!/bin/sh
# Extract the archive $1 to a directory $2 with the program $3. If the
# archive contains a single top-level directory, that directory
# becomes $2. Otherwise $2 contains all the files at the root of the
# archive.
extract () (
set -e
archive=$1
case "$archive" in
-) :;; # read from stdin
/*) :;; # already an absolute path
*) archive=$PWD/$archive;; # make absolute path
esac
target=$2
program=$3
if [ -e "$target" ]; then
echo >&2 "Target $target already exists, aborting."
return 3
fi
case "$target" in
/*) parent=${target%/*};;
*/[!/]*) parent=$PWD/${target%/*};;
*) parent=$PWD;;
esac
temp=$(TMPDIR="$parent" mktemp -d)
(cd "$temp" && $program "$archive")
root=
for member in "$temp/"* "$temp/".*; do
case "$member" in */.|*/..) continue;; esac
if [ -n "$root" ] || ! [ -d "$member" ]; then
root=$temp # There are multiple files or there is a non-directory
break
fi
root="$member"
done
if [ -z "$root" ]; then
# Empty archive
root=$temp
fi
mv -v -- "$root" "$target"
if [ "$root" != "$temp" ]; then
rmdir "$temp"
fi
)
# Extract the archive $1.
process () {
dir=${1%.*}
case "$1" in
*.rar|*.RAR) program="unrar x";;
*.tar|*.tgz|*.tbz2) program="tar -xf";;
*.tar.gz|*.tar.bz2|*.tar.xz) program="tar -xf"; dir=${dir%.*};;
*.zip|*.ZIP) program="unzip";;
*) echo >&2 "$0: $1: unsupported archive type"; exit 4;;
esac
if [ -d "$dir" ]; then
echo >&2 "$0: $dir: directory already exists"
exit 1
fi
extract "$1" "$dir" "$program"
}
for x in "$@"; do
process "$x"
done
Использование (после установки этого скрипта в ваш $PATH
под именем extract
и превращения его в исполняемый):
extract Folder/*.rar