텍스트 파일에서 변수를 전달하는 이상한 문제

텍스트 파일에서 변수를 전달하는 이상한 문제

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

각각 예상대로 줄의 전체 내용을 볼 수 있습니다 echo.$line

단, 내부 connect.sh$1으로 설정되어 있습니다 user\ name.

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

reboot.sh의 각 행을 2개의 매개변수 /tmp/history로 전달 하도록 프로그램 흐름을 어떻게 설정할 수 있습니까 ?connect.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변수의 전체 줄을 얻을 수 있으므로 백스페이스를 사용하여 lineline포함합니다 . user\ name user\ password트릭 없이 그것을 분할하는 것은 쉽지 않습니다 eval. 따옴표가 없는 문자는 $line공백, 백슬래시 여부에 따라 분할됩니다. 인용하면 보시다시피 한 단어로 확장됩니다.

다행히 read백슬래시를 처리하고 입력을 두 개 이상의 변수로 분할할 수 있습니다. 그러면 변수에 user nameand 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"

프로그램에 인수를 전달하고 해당 인수에 공백이 있는 경우 큰따옴표를 사용하여 프로그램이 이를 하나의 인수로 인식하도록 해야 한다는 점을 기억하세요.

관련 정보