
Я пытаюсь написать скрипт, требующий взаимодействия с пользователем. По сути, скрипт должен спрашивать пользователя о 3 параметрах: имя файла(ов), который пользователь хочет найти, количество дней, в течение которых файл(ы) были изменены, и имя архива tar. Когда все параметры известны, скрипт должен найти соответствующие файлы и сделать из них архив с заданным именем. Когда я пишу одну команду в терминал:
find -name 'zad*' -mtime -10 | tar -cvf archive.tar.gz -T -
работает хорошо. Как использовать переменную, введенную пользователем, для вызова команды, которая находится в том же скрипте? Мой скрипт создает пустой архив.
Мой сценарий:
echo "Enter a number of days"
read days
echo "Enter the name of file"
read nameoffile
echo "Enter the name of tar archive"
read nameofarchive
find -name '"$nameoffile"' -mtime -"$days" | tar -cvf "$nameofarchive".tar.gz -T -
решение1
Попробуйте удалить лишние '
кавычки в'"$nameoffile"'
Пример:
maulinglawns@debian-HP:~$ read nameoffile
myFile
maulinglawns@debian-HP:~$ echo '"$nameoffile"'
"$nameoffile"
maulinglawns@debian-HP:~$ echo "$nameoffile"
myFile
Если вам нужны одинарные кавычки, экранируйте их следующим образом:
echo \'$nameoffile\'
'myFile'
решение2
В целом, необходимость взаимодействия с пользователем — очень плохая идея. Это делает невозможным автоматизацию вашего скрипта и сильно затрудняет его использование пользователями, поскольку им приходится вручную вводить текст в среде, которая не поддерживает автодополнение клавишей Tab.
С @maulinglawnsуже объяснилпочему ваш скрипт не сработал, я дам вам более простой способ сделать это, не требующий от ваших пользователей трудоемкого ввода информации:
#!/usr/bin/env sh
days="$1"
nameoffile="$2"
nameofarchive="$3"
find -name "$nameoffile" -mtime -"$days" | tar -cvf $nameofarchive".tar.gz -T -
Затем, чтобы найти файлы с именем foo.txt
, измененные за последние 3 дня, и заархивировать их в bar.tar.gz`, вам нужно выполнить:
script.sh 3 foo.txt bar
Вы также можете добавить простую проверку ошибок, чтобы гарантировать, что скрипт всегда запускается с правильным количеством параметров:
#!/usr/bin/env sh
if [ $# -ne 3 ]; then
echo "You need to enter three arguments"
exit 1
fi
days="$1"
nameoffile="$2"
nameofarchive="$3"
find -name "$nameoffile" -mtime -"$days" | tar -cvf $nameofarchive".tar.gz -T -
решение3
Например, read поддерживает именование переменных;
#!/bin/bash
read -p "How many files? (0-100) " VAR_NUMBER_OF_FILES
read -p "How many days? (0-100) " VAR_NUMBER_OF_DAYS
read -p "Tar file name? " VAR_TAR_NAME
...
find -name '"$VAR_NUMBER_OF_FILES"' -mtime -"$VAR_NUMBER_OF_DAYS" | tar -cvf "$VAR_TAR_NAME".tar.gz -T -