파일의 각 줄에 대해 다른 스크립트를 실행하는 스크립트가 있습니다.
echo
예상대로 매번 $line
행의 전체 내용을 볼 수 있는 경우 .
하지만 connect.sh
내부적으로 $1
만 설정됩니다 user\ name
.
을 사용하려고 하면 "$line"
결과 $1
는 connect.sh
입니다 user\ name user\ password
.
reboot.sh
to의 각 행이 2개의 매개변수로 전달 되도록 프로그램 흐름을 어떻게 설정합니까 ?/tmp/history
connect.sh
최종 결과 $1
는?user\ name
$2
user\ 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"
기억하세요, 프로그램에 인수를 전달하고 인수에 공백이 포함되어 있으면 프로그램이 이를 하나의 인수로 처리하도록 큰따옴표를 사용해야 합니다.