환경: Linux 쉘 이상, busybox의 ash 쉘(예: 시스템: Openwrt).
문자열 변수가 주어지면큰텍스트 "${a}"
는 다음과 같이 구성됩니다.
for index in $(seq 1 40000); do #it is 40000 for a reason, it helps if you want to reproduce the error on your system.
a="${a}""\n""word ${index}"
done
이 변수를 일반 명령에 대한 인수로 사용하려고 하면 오류가 발생한다는 점을 고려하세요. 예를 들면 다음과 같습니다.
echo "${a}" #fails
awk -v VAR_A="${a}" '<program>' #fails
(실패 이유는 다음과 같습니다.http://www.in-ulm.de/~mascheck/various/argmax/)
sed/awk/perl/기타 강력한 인터프리터 대신 간단한 명령을 사용하여 이러한 변수를 텍스트 파일에 쓰는 방법.
이상적으로 텍스트 파일은 다음과 같아야 합니다.
word 1
word 2
word 3
...
다음과 같은 대신:
word 1\nword 2\nword 3\n...
업데이트 1:누군가 "변수를 생성하는 스크립트를 왜 변경할 수 없나요 $a
?"라고 물었습니다. 왜냐하면 권한이 부족해서 할 수 없기 때문입니다("이 스크립트는 현재까지 작동하므로 인쇄 부분만 수정하면 됩니다."). 따라서 $a
해당 형식은 이미 제공되었으며 파일로 인쇄하는 방법만 찾을 수 있습니다.
업데이트 2:제안된 "여기 문서"를 사용하면 대부분의 문제가 해결되었지만 내용은 여전히 한 줄에 인쇄됩니다. 어쩌면 내 구성일까요?
답변1
너 하나 만들 수 있어여기 문서그리고 사용 cat
:
$ cat <<EOT >output
$a
EOT
$ wc -l output
40000
귀하의 Busybox가 얼마나 강력한지는 정확히 모르지만 ash
(구성 가능) 내장된 프로그램이 전혀 없더라도 어디에서나 작동해야 합니다. cat
값 자체를 명령줄에 입력하는 대신 변수 값을 준파일로 확장한 다음 할당합니다 .
"\n"
문자열에서 리터럴을 제거 하려는 것 같으므로 매개변수 대체 중에 문자열 대체를 사용할 수도 있습니다. 이것할 수 있는이 (비 POSIX) 확장이 있는 경우 다음을 사용할 ash
수 있습니다 .sed
${var//\\\n/$NEWLINE}
$ busybox ash
$ foo="x\ny\nz"
$ echo "$foo"
x\ny\nz
$ NEWLINE="
"
$ echo "${foo//\\\n/$NEWLINE}"
x
y
z
이는 동일한 구문입니다.배쉬로; 로 시작하는 ${var/pattern/replacement}
경우 pattern
전역 위치는 어디입니까 /
? ash
많은 것을 구성한 것 같으 므로 존재하지 않을 수도 있습니다. 이 경우 and 를 사용해야 할 수도 있지만 , and 를 현명하게 사용하면 이 문제를 해결하고 올바른 문자열을 재구성할 수 있다고 sed
생각합니다 .IFS
read
답변2
busybox seq -s'
word ' 4000 |
sed '/000/w /dev/fd/2' |
wc -l
산출
word 1000
word 2000
word 3000
word 4000
4000
busybox
내장 함수를 사용 seq
하고 구분 기호를 지정할 수 있어야 합니다 word
. 원하는 경우 >redirect
해당 내용을 파일로 저장할 수 있습니다. 위의 예에서는 sed
출력을 이해하기 위해 4000줄을 볼 필요가 없도록 여러 부분 으로 나누었 지만 모두 인쇄되었습니다. 이것을 지지하지 않는다면 busybox
,업그레이드.
따라서 기본적으로 해야 할 일은 다음 $a
과 같습니다.
busybox seq -s'
word ' $MAX_INCREMENT >$TO_FILE