간단한 bash 스크립트가 작동하지 않습니다

간단한 bash 스크립트가 작동하지 않습니다

이 스크립트는 명령줄에서 인수로 이름이 지정된 모든 파일을 사용자의 홈 디렉터리에 복사해야 합니다. 파일이 제공되지 않으면 스크립트는 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입니다.

관련 정보