텍스트 파일에서 변수를 전달하는 데 이상한 문제가 발생했습니다.

텍스트 파일에서 변수를 전달하는 데 이상한 문제가 발생했습니다.

파일의 각 줄에 대해 다른 스크립트를 실행하는 스크립트가 있습니다.

echo예상대로 매번 $line행의 전체 내용을 볼 수 있는 경우 .

하지만 connect.sh내부적으로 $1만 설정됩니다 user\ name.

을 사용하려고 하면 "$line"결과 $1connect.sh입니다 user\ name user\ password.

reboot.shto의 각 행이 2개의 매개변수로 전달 되도록 프로그램 흐름을 어떻게 설정합니까 ?/tmp/historyconnect.sh

최종 결과 $1는?​user\ name$2user\ password

재시작.sh:

if [ -e "/tmp/history" ]; then
  while read -r line; do
    echo $line
    connect.sh $line \
      && break
  done </tmp/history
fi

연결.sh:

echo $1
echo $2

/tmp/역사:

user\ name user\ password

답변1

백슬래시는 값을 분리하지 않도록 두 공백을 이스케이프 처리하는 것이라고 가정합니다.

이렇게 하면 read -r line변수의 전체 줄을 얻을 수 있으므로 line, 및 백스페이스 키도 line포함됩니다 . user\ name user\ password기술 없이는 나누기가 쉽지 않습니다 eval. 인용되지 않은 내용은 $line공백과 백슬래시로 구분됩니다. 인용한 후에는 보시다시피 단어로 확장됩니다.

다행스럽게도 read백슬래시를 처리하고 입력을 두 개 이상의 변수로 분할할 수 있습니다. 이렇게 하면 변수에 user name다음이 포함됩니다 user password(백슬래시 제거).

while read user pass ; do 
    echo "user: $user"
    echo "pass: $pass"
    ./connect.sh "$user" "$pass"
done < file

그러나 사용자 이름과 비밀번호에 공백을 허용하려면 공백 이외의 구분 기호를 사용하는 것이 좋습니다. 콜론은 일반적이므로 다음과 같은 입력을 갖게 됩니다.

user name:user pass word

그럼 읽어봐

while IFS=: read -r user pass ; do 
    echo "user: $user"
    echo "pass: $pass"
done < file          

(비밀번호가 콜론으로 끝나지 않는 한 작동합니다)

답변2

인수에 공백이 포함된 경우 문자열이 여러 인수로 해석되지 않도록 큰따옴표로 묶어야 합니다 connect.sh. 문자열을 여러 매개변수로 분할할 수 있습니다. 해당 줄의 형식이 무엇인지는 잘 모르겠지만 다음과 같이 할 수 있습니다.

line="user name user password"
# Split the line into space-separated tokens and store 1 and 2
UNAME=$(echo "$line" | cut -d ' ' -f 1,2)
# Split the line into space-separated tokens and store 3 and 4
UPASSWD=$(echo "$line" | cut -d ' ' -f 3,4)
echo "$UNAME"
echo "$UPASSWD"

다음과 같이 인쇄되어야 합니다.

user name
user password

입력 라인의 실제 형식에 따라 일부 조정이 필요할 수 있습니다. 예를 들어, $line에 사용자 이름과 사용자 비밀번호가 쉼표로 구분되어 있는 경우 다음을 실행할 수 있습니다.

line="user name,user password"
# Split the line into comma-separated tokens and store 1
UNAME=$(echo "$line" | cut -d ',' -f 1)
# Split the line into comma-separated tokens and store 2
UPASSWD=$(echo "$line" | cut -d ',' -f 2)
echo "$UNAME"
echo "$UPASSWD"

기억하세요, 프로그램에 인수를 전달하고 인수에 공백이 포함되어 있으면 프로그램이 이를 하나의 인수로 처리하도록 큰따옴표를 사용해야 합니다.

관련 정보