Чтобы ваш скрипт работал с минимальными изменениями, используйте $afile
всякий раз, когда вам нужно значение переменной.Знак доллара делает переменную ссылку;в противном случае вы просто получите буквальную строку 'afile'
.Также избавьтесь от квадратных скобок и вместо echo
переменной grep
.
for afile in `ls -1`; do
if echo "$afile" | grep '\.tar\.gz'
then
tar -xzf "$afile"
elif echo $afile | grep '\.tar\.xz'
then
tar -xJf "$afile"
elif echo "$afile" | grep '\.tar\.bz2'
then
tar -xjf "$afile"
else
echo "Something is wrong with the program"
fi
done
Поскольку вы новичок в bash, давайте рассмотрим различные другие способы написания сценария.Я бы сделал пару улучшений.Например, вы не должны зацикливаться на ls
.Вы можете получить то же самое, зациклившись на *
.Во-вторых, grep
- тяжелый инструмент.Вы можете сделать несколько простых сравнений строк со встроенными конструкциями оболочки, такими как [[
и ==
.
for afile in *; do
if [[ "$afile" == *.tar.gz ]]; then
tar -xzf "$afile"
elif [[ "$afile" == *.tar.xz ]]; then
tar -xJf "$afile"
elif [[ "$afile" == *.tar.bz2 ]]; then
tar -xjf "$afile"
else
echo "Something is wrong with the program"
fi
done
На самом деле, это было бы еще лучше с оператором case
.Давайте попробуем это.Также давайте повторим сообщение об ошибке в stderr с >&2
.Это всегда хорошая идея.
for afile in *; do
case "$afile" in
*.tar.gz) tar -xzf "$afile";;
*.tar.xz) tar -xJf "$afile";;
*.tar.bz2) tar -xjf "$afile";;
*) echo "Something is wrong with the program" >&2
esac
done
Мы могли бы даже избавиться от сообщения об ошибке, если бы просто перечислили три типа файлов, которые мы хотим зациклить.Тогда нет способа попасть в другой случай.
for afile in *.tar.{gz,xz,bz2}; do
case "$afile" in
*.tar.gz) tar -xzf "$afile";;
*.tar.xz) tar -xJf "$afile";;
*.tar.bz2) tar -xjf "$afile";;
esac
done
Или совершенно другой способ сделать это: используйте find
, чтобы найти все файлы, и его действие -exec
, чтобы вызвать команду для каждого файла.это находит.Здесь {}
является заполнителем для файлов, которые он находит.
find . -name '*.tar.gz' -exec tar -xzf {} \;
find . -name '*.tar.xz' -exec tar -xJf {} \;
find . -name '*.tar.bz2' -exec tar -xjf {} \;