문자열 배열의 요소에 액세스 - stray @ 기호

문자열 배열의 요소에 액세스 - stray @ 기호

배열(3개 요소)을 만들었습니다. 각 요소에는 쉼표로 구분된 문자열이 포함되어 있습니다. 배열은 파일을 한 줄씩 읽어서 생성됩니다. 파일에는 데이터베이스에서 출력된 필드가 포함되어 있습니다. 각 문자열 요소가 마치 배열인 것처럼 반복되도록 아래 코드를 작성했습니다.

배열의 마지막 요소에 추가 @ 기호가 있는 이상한 버그를 제외하고는 작동합니다.

(또한 Mac에서 bash 4를 사용하고 있다고 판단했지만 -A가 작동하지 않는다고 명시했습니다.)

i=0
declare -a items
while read line
    do
        items[i]=$line
    ((i++))
    done < test_file1.txt

declare -a item_arr
for item in "${items[@]}"
   do
     item_arr=($item[@])
   done
echo "${item_arr[4]}://${item_arr[1]}:${item_arr[3]}@${item_arr[2]}/control/configinfo"

출력은 다음과 같습니다: https[@]://192.168.1.152:username@pwd/control/configinfo

@ 기호가 인쇄되는 이유는 무엇입니까? 시간을 낭비하고 있나요? awk를 사용해야 하나요? 그렇지 않으면 이것은 매우 간단한 접근 방식처럼 느껴지지만 이는 상대적으로 경험이 부족하기 때문일 수 있습니다. 초기화해야 할 최대 항목 수는 아마도 1~200개일 것입니다.

내 코드의 목적은 각 프로젝트에 대한 컬 요청을 작성하기 위해 데이터베이스에서 일부 config_info, 사용자 이름, 비밀번호, IP 주소, 프로토콜을 모두 가져오는 컬 요청을 생성하는 것입니다.

미리 감사드립니다!

답변1

item는 스칼라 문자열 변수(배열이 아님)이므로 다음과 같이 말해야 합니다.

item_arr=($item)

대신에

item_arr=($item[@])

그렇다면 그렇다면$itemThe quick brown fox

item_arr=($item[@])

~이 되다

item_arr=(The quick brown fox[@])

답변2

당신 말이 맞아요, awk가 더 쉬울 거예요.

소스 예/tmp/test2.txt:

$ cat /tmp/test2.txt
192.168.1.152 pwd username https
$ awk '{print $4 "://" $1 ":" $3 "@" $2 "/control/configinfo" }' /tmp/test2.txt
https://192.168.1.152:username@pwd/control/configinfo

답변3

bash파일 내용(IP 주소, 사용자 이름, 비밀번호 등)을 쉘 메모리(예: 배열)에 저장할 필요가 없다고 가정하고 pure 에서 이 작업을 더 쉽게 수행하려면 다음 을 수행할 수 있습니다.

while read ip_address pwd username protocol
do
        echo "${protocol}://${ip_address}:$username@$pwd/control/configinfo"
done < test_file1.txt

이는 솔루션보다 유지 관리가 더 쉬울 수 있습니다 awk.

관련 정보