IN="MJHVIZN ZPIO YJHPN"
for I in $(seq 25); do
echo $I $IN | tr $(printf %${I}s | tr ' ' '.')\A-Z A-ZA-Z
done
누구든지 이 코드를 설명할 수 있습니까? 이 중첩된 문 때문에 혼란스러워요
echo $I $IN | tr $(printf %${I}s | tr ' ' '.')\A-Z A-ZA-Z
답변1
에서는 printf
고정 길이 필드에 문자열을 인쇄합니다.%[number]s
숫자캐릭터는 넓고 공간을 채운다. 따라서 %12s
12자 필드가 생성됩니다. 여기서와 같이 문자열이 비어 있으면 12개의 공백만 생성됩니다. 따라서 printf %${I}s
변수 I
가 지시하는 만큼의 공백이 생성된 후 점으로 변경됩니다.
즉 I
, 4
다른 쪽이 tr
첫 번째 인수 ....A-Z
, 두 번째 인수를 가져옵니다 A-ZA-Z
. 그것들을 확장하고 하나로 합치면 우리는 얻는다.
....ABCDEFGHIJKLMNOPQRSTUVWXYZ ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ
I
이는 was의 값만큼 4개의 문자 이동에 해당합니다 .
답변2
파이프라인의 두 번째 명령이 무엇인지 확인할 수 있도록 에코를 추가했습니다. 이 명령의 매개변수는 를 사용하여 구성됩니다 $()
.
in="MJHVIZN ZPIO YJHPN"
for i in $(seq 25); do
echo tr $(printf %${i}s | tr ' ' '.')\A-Z A-ZA-Z
done
실행한 후에는 더 의미가 있을 것입니다.
또한 변수 이름에서 대문자를 제거했습니다. 거기서 누가 가르쳤는지 모르겠어요. 소문자여야 한다는 표준이 있습니다.