배열의 인덱스 범위로 인해 bash에서 새 줄을 반복 할 수 없습니다.

로봇 조니

나는 retropie에서 중복 이름 지정 문제를 수정하는 간단한 bash 스크립트를 작성 중입니다.

스크립트 자체는 gameslist.xml 파일에서 두 번 이상 언급 된 이름을 가져 와서 나중에 사용할 수 있도록 배열에 저장합니다.

다음과 같이 인덱스에서이 배열을 반복합니다.

pi@retropie:~ $ for game in ${game_array[@]:0:10} ; do echo $game; done

첫 번째 요소를 10 번째 요소 (예 ${game_array[9]}:)로 가져 오지만 출력은 한 줄로 연결됩니다.

pi@retropie:~ $ for game in ${game_array[@]:0:10} ; do echo $game; done
R.B.I. Baseball '94 World Series Baseball '95 Mega Games 1 Bill Walsh College Football T2: The Arcade Game Sonic & Knuckles + Sonic the Hedgehog Sega Top Five Pyramid Magic Tecmo Super Baseball Super Chinese Tycoon

그러나 전체 배열을 반복하면 예상대로 새 줄에 출력됩니다.

pi@retropie:~ $ for game in ${game_array[@]}; do echo $game; done | head -10
R.B.I. Baseball '94
World Series Baseball '95
Mega Games 1
Bill Walsh College Football
T2: The Arcade Game
Sonic & Knuckles + Sonic the Hedgehog
Sega Top Five
Pyramid Magic
Tecmo Super Baseball
Super Chinese Tycoon

필드 구분자가 새 줄로 설정되었으므로 IFS='$\n'두 번째 줄이 작동하는 이유는 있지만 첫 번째 줄이 아닌 이유를 평생 알 수 없습니까?

컨텍스트에 대한 전체 테스트 스크립트는 다음과 같습니다.

#!/bin/bash

user_input=$1
while [ -z "$user_input" ]; do
        echo "please enter the name of the system you want to fix the game list for"
        echo "(as it is labelled in /home/pi/RetroPie/roms)"
        read -r user_input
done

ls "/home/pi/RetroPie/roms/$user_input" >/dev/null 2>&1

if  [ "$?" -ne 0 ]; then
        echo "this doesn't appear to be a system installed here. exiting."
        exit 1
fi

games_to_fix()
{
        IFS=$'\n'
        console=$1
        filepath="/opt/retropie/configs/all/emulationstation/gamelists/$console/gamelist.xml"
        game_array=($(fgrep "<name>" "$filepath" | sort | uniq -c | sort -rn | awk  '$1 > 1 {print $0}'| cut -d ">" -f 2 | cut -d "<" -f 1))
        number_to_fix=($(fgrep "<name>" "$filepath" | sort | uniq -c | sort -rn | awk  '$1 > 1 {print $1}'))
}

get_new_name()
{
        mYpath=$1
        new_name=$(echo $mYpath | cut -d ">" -f 2 | cut -d "<" -f 1 | sed -e 's/\.\///g' | sed -e 's/\.7z//g')
}

games_to_fix $user_input

IFS=$'\n'
index=0
for i in ${number_to_fix[@]}; do
        loop=1
        for game in ${game_array[@]:$index:$i}; do
        #       for ind in $(eval echo {1..$i}); do
                line_number=$(fgrep -n "<name>$game</name>"  $filepath | awk '{print $1}' | cut -d : -f 1 | sed -e "${loop}q;d")
                path_line_number=$(expr $line_number - 1 )
                path=$(sed "${path_line_number}q;d" $filepath | cut -d : -f 2)
                get_new_name "$path"
                sed -i "${line_number}s/$game/$new_name/g" $filepath
                ((loop++))
        done
        index=$(expr index + $i);
done
일 카츄

간단히 말해서 필드 / 단어 분할을 명시 적으로 원하지 않는 한 배열 확장 주위에 따옴표를 사용해야합니다 . "$@"각 위치 매개 변수를 별도의 단어로 확장하고 마찬가지로 "${a[@]}". 확장하면 "${a[@]:0:2}".


즉, 여전히 Bash에서 불일치하는 것처럼 보이며 사용한 것은 귀하의 경우에서 작동해야합니다 (값에 glob 문자가없고 필드 분할이 IFS적절하게 설정 되어 처리 되기 때문입니다).

전체 어레이 작동 :

$ IFS=$'\n'
$ a=("foo bar" "asdf ghjk")
$ printf "%s\n" ${a[@]}
foo bar
asdf ghjk

슬라이싱은 배열에서는 작동하지 않지만 다음에서는 작동합니다 $@.

$ printf "%s\n" ${a[@]:0:2}
foo bar asdf ghjk

$ set -- "aa bb" "cc dd"
$ printf "%s\n" ${@:1:2}
aa bb
cc dd

그것은 ksh와 zsh에서 작동합니다. 이것은 Bash가 여기에서 일관되지 않는 밑줄을 긋습니다 (물론 zsh는 이에 상응하는 자체 구문을 가질 것입니다) .

$ ifs=$'\n' ksh -c 'IFS="$ifs"; a=("foo bar" "asdf ghjk"); printf "%s\n" ${a[@]:0:2}'
foo bar
asdf ghjk
$ ifs=$'\n' zsh -yc 'IFS="$ifs"; a=("foo bar" "asdf ghjk"); printf "%s\n" ${a[@]:0:2}'
foo bar
asdf ghjk

인용 된 버전은 Bash에서도 작동하며 .NET에 의존 할 필요가 없기 때문에 값을있는 그대로 원할 때 더 좋습니다 IFS. 기본값 IFS은 배열 요소에 공백이 있어도 여기서 잘 작동합니다.

$ unset IFS                         # uses default of $' \t\n'
$ printf "%s\n" "${a[@]:0:2}"
foo bar
asdf ghjk

인용되지 않은 ${a[@]:0:2}요소가 공백으로 요소를 결합하는 것처럼 보입니다 . 단어 분할이 발생하지 않는 상황에서 Bash에서 발생하는 것과 비슷합니다 (예 :) str=${a[@]}. 그런 다음 IFS평소 같이 결과를으로 분할하려고합니다 . 예를 들어 여기에서는 두 번째 배열 요소의 중간에있는 개행 문자로 분할됩니다.

$ IFS=$'\n'
$ a=("foo bar" $'new\nline' "asdf ghjk");
$ printf ":%s\n" ${a[@]:0:3}
:foo bar new
:line asdf ghjk

위에서 말했듯이 대부분의 경우 배열 확장 주위에 따옴표를 사용해야하지만 그래도 ${a[@]:n:m}마찬가지로 여러 단어가 나올 것이라고 가정 ${a[@]}합니다.

여기의 동작은 Bash 4.4.12(1)-release5.0.0(1)-alpha. 버그 리포트를 올렸습니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

데이터 프레임을 반복하는 동안 새로 찾은 값을 동일한 인덱스의 새 열에 어떻게 배치 할 수 있습니까?

분류에서Dev

laravel에서 인덱스없이 배열 배열을 객체 배열로 변환 할 수 없습니다.

분류에서Dev

strcpy를 통해 인수에서 char 배열로 복사 할 수 없습니다.

분류에서Dev

각 숫자의 범위가 가능한 한 효율적으로 다른 열의 인덱스에 종속되는 새 반복 인덱스를 만듭니다.

분류에서Dev

배열 포인터 C의 인덱스에 액세스 할 수 없습니다.

분류에서Dev

다음 배열을 위해 JSON 배열을 반복 할 수 없습니다.

분류에서Dev

bash 셸에서 배열을 인쇄 할 수 없습니다.

분류에서Dev

JavaScript의 인덱스에서 배열을 역순으로 반복

분류에서Dev

JavaScript의 인덱스에서 배열을 역순으로 반복

분류에서Dev

내 테스트에서 가짜 배열을 범위 변수에 바인딩 할 수 없습니다.

분류에서Dev

일부 범위에 대해 C ++에서 문자열을 제대로 반환 할 수 없습니다.

분류에서Dev

yaml 파일의 범위 함수 내에서 인덱스를 참조 할 수 없습니다.

분류에서Dev

명령 줄을 통해 MAMP에서 MySQL에 로그인 할 수 없습니다.

분류에서Dev

Flutter에서 List의 각 인덱스에 대해이 함수를 어떻게 반복 할 수 있습니까?

분류에서Dev

PHP는 하나의 명령문에서 알 수없는 인덱스로 배열 값을 얻습니다.

분류에서Dev

첫 번째 기호로 인해 배치 전문가가 필요한 파일을 반복 할 수 없습니다.

분류에서Dev

위치별로 날짜 열 선택 : #IndexingError : 너무 많은 인덱서 AND TypeError : 슬라이스 인덱싱을 수행 할 수 없습니다.

분류에서Dev

레일에서 나는 각각의 반복으로 새 주석을 표시 할 수 없습니다.

분류에서Dev

따옴표가 반복되지 않도록 배열에서 선택한 항목을 제거한 다음 새 배열로 푸시 할 수 없습니다.

분류에서Dev

함수에서 반환 한 하위 배열은 "null 유형의 값"으로 인해 사용할 수없는 경우가 있습니다.

분류에서Dev

numpy TypeError에서 배열 요소 획득 : 슬라이스 인덱싱을 수행 할 수 없습니다.

분류에서Dev

포인터를 통해 함수에서 3D 배열을 반환 할 수 없습니다.

분류에서Dev

문자 배열의 짝수 및 홀수 인덱스를 Matlab의 새로운 작은 문자 배열에 어떻게 재 할당합니까?

분류에서Dev

다른 배열의 값을 기반으로 numpy 배열의 선택 인덱스에 대한 작업 수행

분류에서Dev

Linux 전용 'ascii'코덱은 위치 3의 문자 u '\ u0161'을 인코딩 할 수 없습니다. 서 수가 범위에 없습니다 (128).

분류에서Dev

일반 자바 스크립트에서 인덱스 노드의 객체를 구성하기 위해 숫자 배열을 반복합니다.

분류에서Dev

jQuery에서 키 / 값 배열을 반복 할 수 없습니다.

분류에서Dev

Angular ng-option : 다른 배열의 내용을 표시하기 위해 숫자 배열을 반복하지만 ng-model에서 선택한 인덱스

분류에서Dev

인덱스로 PHP 배열에 액세스 할 수 없습니까?

Related 관련 기사

  1. 1

    데이터 프레임을 반복하는 동안 새로 찾은 값을 동일한 인덱스의 새 열에 어떻게 배치 할 수 있습니까?

  2. 2

    laravel에서 인덱스없이 배열 배열을 객체 배열로 변환 할 수 없습니다.

  3. 3

    strcpy를 통해 인수에서 char 배열로 복사 할 수 없습니다.

  4. 4

    각 숫자의 범위가 가능한 한 효율적으로 다른 열의 인덱스에 종속되는 새 반복 인덱스를 만듭니다.

  5. 5

    배열 포인터 C의 인덱스에 액세스 할 수 없습니다.

  6. 6

    다음 배열을 위해 JSON 배열을 반복 할 수 없습니다.

  7. 7

    bash 셸에서 배열을 인쇄 할 수 없습니다.

  8. 8

    JavaScript의 인덱스에서 배열을 역순으로 반복

  9. 9

    JavaScript의 인덱스에서 배열을 역순으로 반복

  10. 10

    내 테스트에서 가짜 배열을 범위 변수에 바인딩 할 수 없습니다.

  11. 11

    일부 범위에 대해 C ++에서 문자열을 제대로 반환 할 수 없습니다.

  12. 12

    yaml 파일의 범위 함수 내에서 인덱스를 참조 할 수 없습니다.

  13. 13

    명령 줄을 통해 MAMP에서 MySQL에 로그인 할 수 없습니다.

  14. 14

    Flutter에서 List의 각 인덱스에 대해이 함수를 어떻게 반복 할 수 있습니까?

  15. 15

    PHP는 하나의 명령문에서 알 수없는 인덱스로 배열 값을 얻습니다.

  16. 16

    첫 번째 기호로 인해 배치 전문가가 필요한 파일을 반복 할 수 없습니다.

  17. 17

    위치별로 날짜 열 선택 : #IndexingError : 너무 많은 인덱서 AND TypeError : 슬라이스 인덱싱을 수행 할 수 없습니다.

  18. 18

    레일에서 나는 각각의 반복으로 새 주석을 표시 할 수 없습니다.

  19. 19

    따옴표가 반복되지 않도록 배열에서 선택한 항목을 제거한 다음 새 배열로 푸시 할 수 없습니다.

  20. 20

    함수에서 반환 한 하위 배열은 "null 유형의 값"으로 인해 사용할 수없는 경우가 있습니다.

  21. 21

    numpy TypeError에서 배열 요소 획득 : 슬라이스 인덱싱을 수행 할 수 없습니다.

  22. 22

    포인터를 통해 함수에서 3D 배열을 반환 할 수 없습니다.

  23. 23

    문자 배열의 짝수 및 홀수 인덱스를 Matlab의 새로운 작은 문자 배열에 어떻게 재 할당합니까?

  24. 24

    다른 배열의 값을 기반으로 numpy 배열의 선택 인덱스에 대한 작업 수행

  25. 25

    Linux 전용 'ascii'코덱은 위치 3의 문자 u '\ u0161'을 인코딩 할 수 없습니다. 서 수가 범위에 없습니다 (128).

  26. 26

    일반 자바 스크립트에서 인덱스 노드의 객체를 구성하기 위해 숫자 배열을 반복합니다.

  27. 27

    jQuery에서 키 / 값 배열을 반복 할 수 없습니다.

  28. 28

    Angular ng-option : 다른 배열의 내용을 표시하기 위해 숫자 배열을 반복하지만 ng-model에서 선택한 인덱스

  29. 29

    인덱스로 PHP 배열에 액세스 할 수 없습니까?

뜨겁다태그

보관