![간단한 bash 스크립트가 작동하지 않습니다](https://linux55.com/image/154751/%EA%B0%84%EB%8B%A8%ED%95%9C%20bash%20%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EA%B0%80%20%EC%9E%91%EB%8F%99%ED%95%98%EC%A7%80%20%EC%95%8A%EC%8A%B5%EB%8B%88%EB%8B%A4.png)
이 스크립트는 명령줄에서 인수로 이름이 지정된 모든 파일을 사용자의 홈 디렉터리에 복사해야 합니다. 파일이 제공되지 않으면 스크립트는 read를 사용하여 파일 이름을 요청하고 응답에 제공된 모든 파일 이름을 사용자의 홈 디렉터리에 복사해야 합니다.
if [ -z $1 ]
then
echo provide filenames
read $FILENAMES
else
FILENAMES="$@"
fi
echo the following filenames have been provided: $FILENAMES
for i in $FILENAMES
do
cp $i $HOME
done
문자열 형식으로 매개변수를 제공하면 작동합니다. 하지만 "$FILENAMES 읽기"를 제공하면 작동하지 않습니다.
강사는 자신의 강좌에서 동일한 솔루션을 보여주었지만 작동 방식은 보여주지 않았습니다.
업데이트 파일 이름을 매개변수로 입력한 후 빈 문자열이 제공되고 파일이 $HOME 위치에 복사되지 않았습니다.
[dmytro@oc1726036122 ~]$ cd Desktop/
[dmytro@oc1726036122 Desktop]$ . totmp
provide filenames
one two
the following filenames have been provided:
the following filenames have been provided:
[dmytro@oc1726036122 Desktop]$
답변1
read
변수를 읽는 대신 선언하세요 . 한마디로 $
내용을 삭제 read
하면 됩니다 .
if [ -z $1 ]
then
echo provide filenames
read FILENAMES
else
FILENAMES="$@"
fi
echo the following filenames have been provided: $FILENAMES
for i in $FILENAMES
do
cp $i $HOME
done
source
편집: ( .
) 명령을 사용하여 스크립트를 실행하는 것을 확인했습니다 .
[dmytro@oc1726036122 Desktop]$ . totmp
이 특정 스크립트에는 괜찮을 수 있지만 복잡한 스크립트에는 절대로 이 작업을 수행하지 마십시오. 그렇지 않으면 스크립트의 모든 변수나 함수를 셸로 가져오게 됩니다. 그냥 사용bash totmp
답변2
당신을 방해하는 것 같은 문제는 명령이 read
올바르지 않다는 것입니다. 명령에 전달된 인수는 변수 이름이어야 하므로 $
( $
변수의 내용을 확장하고 변수가 비어 있는 시점에서) 없이 확장해야 합니다. 이므로 결과는 read
변수 이름이 전달되지 않은 상태입니다.)
read FILENAMES
첫 번째 명령줄 인수가 누락되었는지 확인하는 데에는 또 다른 문제가 있습니다. 존재하지 않으면 $1
아무것도(빈 문자열이 아님)로 확장되어 명령에 문제가 발생할 수 있습니다 [
. 이 경우 확인하려는 내용이 [ -z ]
실제로 유효하지 않아야 하기 때문입니다. [ -z "" ]
즉, 변수를 참조해야 합니다.
if [ -z "$1" ]
Bash를 사용할 때 를 사용할 수도 있습니다 [[ ... ]]
. 내부 명령이기 때문에 일반적으로 더 좋습니다(이 경우 명령은 따옴표 없이 작동해야 하지만 따옴표를 유지해도 문제가 되지 않고 괜찮아 보입니다.)
(PS: 이 스크립트에는 여전히 많은 버그가 있습니다. 모범 사례와는 거리가 멀고, 누군가 이것을 가르치는 것을 보고 정말 충격을 받았습니다. 불행하게도 bash를 가르치는 기준이 정말 낮은 것 같고 매뉴얼도 꽤 괜찮은 것 같습니다. 실제로 잘 이해하기 전까지는 복잡하므로 제대로 배우는 방법에 대한 더 나은 조언이 있는지 모르겠습니다).☹️
답변3
이 read
명령은 변수를 허용하지만 변수 값을 인용했습니다.
#correct syntax
read variable
#wrong syntax
read $variable
$variable
값이며 variable
스크립트 시작 부분에서 값은 설정되지 않음/null입니다.