bash: 두 개의 문자열 변수를 반복하여 심볼릭 링크 생성

bash: 두 개의 문자열 변수를 반복하여 심볼릭 링크 생성

저는 두 개의 bash 변수를 만들었습니다. 둘 다 문자열 라인입니다.

$oldfilenames다음과 같습니다

path/old-filename-1.txt
path/old-filename-2.txt
path/old-filename-3.txt
path/old-filename-4.txt
...

그리고

$newfilenames다음과 같습니다

new-filename-1.txt
new-filename-2.txt
new-filename-3.txt
new-filename-4.txt
...

이 두 변수를 사용하여 내 디렉토리에 심볼릭 링크를 생성하고 싶습니다.

두 변수의 길이는 동일합니다. 나는 다음과 같은 일을하기를 바라고 있습니다 :

for x in $oldfilenames; y in $newfilenames; do 
  ln -s $x $y
done

나는 그것이 올바른 구문이 아니며 제대로 작동하지 않는다고 생각합니다.

답변1

줄 바꿈으로 구분된 문자열이 파일 이름 시퀀스를 처리하는 좋은 방법인지 확신할 수 없습니다(대신 배열을 사용하는 것이 좋을 수도 있습니다).

그러나 그것이 당신이 가지고 있는 것이라면,여기 문자열read번호가 매겨진 파일 설명자에서 읽을 수 있는 내장 기능을 사용하면 다음과 같이 작동할 수 있습니다.

while IFS= read -r -u3 x; IFS= read -r -u4 y; do 
  echo ln -s "$x" "$y"
done 3<<<"$oldfilenames" 4<<<"$newfilenames"

[ echo테스트 목적으로 포함되었습니다].

답변2

동시에 두 개의 목록을 반복하는 기본 제공 구성은 없습니다. 명령문 for은 하나의 목록을 반복합니다.

배열과 함께 쉘을 사용하는 경우,목록을 개행으로 구분된 문자열로 저장하지 말고 대신 배열을 사용하세요..

oldfilenames및 배열인 경우 newfilenames배열 인덱스를 반복할 수 있습니다.

for ((i=0; i<${#oldfilenames[@]}; i++)); do
  x=${oldfilenames[$i]}; y=${newfilenames[$i]}; …
done

개행으로 구분된 문자열이 필요한 경우 첫 번째 줄을 한 번에 한 줄씩 제거할 수 있습니다.

nl='
'
oldfilenames=${oldfilenames%"$nl"}
while [ -n "$oldfilenames" ]; do
  x=${oldfilenames%%"$nl"*}; y=${newfilenames%%"$nl"*}
  oldfilenames=${oldfilenames#*"$nl"}; newfilenames=${newfilenames#*"$nl"};
done

관련 정보