사용자 상호작용이 필요한 스크립트를 작성하려고 합니다. 기본적으로 스크립트는 사용자에게 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
일반적으로 사용자 상호 작용을 요구하는 것은 매우 나쁜 생각입니다. 이로 인해 스크립트를 자동화할 수 없게 되고 탭 완성이 허용되지 않는 환경에서 사용자가 수동으로 입력해야 하므로 사용자가 사용하기 어렵게 됩니다.
@maulinglawns 이후이미 설명함스크립트가 실패하는 이유는 무엇입니까? 사용자가 힘들게 정보를 입력할 필요가 없는 더 쉬운 방법을 제공하겠습니다.
#!/usr/bin/env sh
days="$1"
nameoffile="$2"
nameofarchive="$3"
find -name "$nameoffile" -mtime -"$days" | tar -cvf $nameofarchive".tar.gz -T -
그런 다음 지난 3일 동안 수정된 이름의 파일을 찾아 foo.txt
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 -