각 요소가 새 줄에 배치되도록 bash 배열 변수를 파일에 작성하고 싶습니다. for 루프를 사용하여 이 작업을 수행할 수 있지만 요소를 로 결합하는 또 다른 (더 깔끔한) 방법이 있습니까 \n
?
답변1
bash 매개변수 확장과 특수 변수를 활용하는 방법은 다음과 같습니다 IFS
.
$ System=('s1' 's2' 's3' 's4 4 4')
$ ( IFS=$'\n'; echo "${System[*]}" )
IFS
현재 환경에서 값을 덮어쓰는 것을 방지하기 위해 서브쉘을 사용합니다 . 그런 다음 해당 서브셸에서 IFS
첫 번째 문자가 개행 문자가 되도록 값을 수정합니다 (인용 $'...'
부호 사용). 마지막으로 매개변수 확장을 사용하여 배열의 내용을 단일 단어로 인쇄합니다. 각 요소는 의 첫 번째 문자로 구분됩니다 IFS
.
변수로 캡처하려면 다음을 수행하십시오.
$ var=$( IFS=$'\n'; echo "${System[*]}" )
bash가 충분히 새로운 것(4.2 이상)이라면 다음 옵션을 계속 사용할 수 있습니다(그리고 사용해야 합니다 printf
) -v
.
$ printf -v var "%s\n" "${System[@]}"
두 경우 모두에서 최종 개행 문자를 원하지 않을 수 있습니다 var
. 제거하려면:
$ var=${var%?} # Remove the final character of var
답변2
printf
다음을 사용하여 각 배열 항목을 자체 줄에 인쇄 할 수 있습니다 .
$ System=('s1' 's2' 's3' 's4 4 4')
$ printf "%s\n" "${System[@]}"
s1
s2
s3
s4 4 4
답변3
awk -v sep='\n' 'BEGIN{ORS=OFS="";for(i=1;i<ARGC;i++){print ARGV[i],ARGC-i-1?sep:""}}' "${arr[@]}"
또는
perl -le 'print join "\n",@ARGV' "${arr[@]}"
또는
python -c 'import sys;print "\n".join(sys.argv[1:])' "${arr[@]}"
또는
sh -c 'IFS=$'\''\n'\'';echo "$*"' '' "${arr[@]}"
또는
lua <(echo 'print(table.concat(arg,"\n"))') "${arr[@]}"
또는
tclsh <(echo 'puts [join $argv "\n"]') "${arr[@]}"
또는
php -r 'echo implode("\n",array_slice($argv,1));' -- "${arr[@]}"
또는
ruby -e 'puts ARGV.join("\n")' "${arr[@]}"
그것이 내가 지금까지 상기시킬 수 있는 전부입니다.
답변4
사용~을 위한:
for each in "${alpha[@]}"
do
echo "$each"
done
사용역사; 값에 다음이 포함되면 실패합니다 !
.
history -p "${alpha[@]}"
사용기본 이름; 값에 다음이 포함되면 실패합니다 /
.
basename -a "${alpha[@]}"
사용슈프; 결과가 순서대로 나오지 않을 수도 있습니다.
shuf -e "${alpha[@]}"