저는 두 개의 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