bash 배열 변수를 개행 문자로 구분된 문자열로 어떻게 변환합니까?

bash 배열 변수를 개행 문자로 구분된 문자열로 어떻게 변환합니까?

각 요소가 새 줄에 배치되도록 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[@]}"

관련 정보