파일의 각 줄에 대해 다른 스크립트를 실행하는 스크립트가 있습니다.
각각 예상대로 줄의 전체 내용을 볼 수 있습니다 echo
.$line
단, 내부 connect.sh
만 $1
으로 설정되어 있습니다 user\ name
.
을 사용하려고 하면 "$line"
결국 $1
가 connect.sh
됩니다 user\ name user\ password
.
reboot.sh
의 각 행을 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
and 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"
프로그램에 인수를 전달하고 해당 인수에 공백이 있는 경우 큰따옴표를 사용하여 프로그램이 이를 하나의 인수로 인식하도록 해야 한다는 점을 기억하세요.