>

bash 변수에 여러 줄을 저장하려고하는데 작동하지 않는 것 같습니다.

예를 들어 /bin 를 나열하면  한 줄에 파일 하나를 $LS 에 저장 그런 다음 $LS 를 전달합니다.   wc 에 stdin로 항상 1을 반환합니다.

$ ls -1 /bin | wc -l
134
$ LS=$(ls -1 /bin); wc -l <<< $LS
1

화면으로 출력하려고하면 다양한 결과가 나타납니다 : echo   printf 동안 모든 줄을 한 줄로 인쇄합니다.  첫 번째 줄만 인쇄합니다 :

#!/bin/bash
LS=$(ls -1 /bin)
echo $LS
printf $LS

bash 변수는 여러 줄을 포함 할 수 있습니까?

  • 답변 # 1

    큰 따옴표로 묶어야합니다 (대부분의 경우 큰 따옴표 변수를해야합니다) :

    echo "$LS"
    
    

    하지만 대신 printf를 사용하여 변수 내용을 인쇄하기 위해 echo를 사용하지 마십시오 :

    printf '%s\n' "$LS"
    
    

  • 답변 # 2

    개행은 변수에 있습니다. 와이즈 비즈  변수 LS=$(ls -1) 를 설정합니다   LS 의 출력에  ( ls -1 와 동일한 출력을 생성합니다. 그건 그렇고, 출력이 터미널로 갈 때를 제외하고는 줄 바꿈을 뺀 것입니다.

    문제는 값을 인쇄 할 때 줄 바꿈을 제거한다는 것입니다. 쉘 스크립트에서 ls  "변수 $LS 의 값을 의미하지는 않습니다. , 그것은" LS 의 가치를 받아들입니다"를 의미합니다 LS 에 따라 단어로 나눕니다.  각 단어를 glob 패턴으로 해석하십시오." IFS 의 가치를 얻으려면 , 당신은 LS 를 작성해야합니다 더 일반적으로 "$LS" 를 넣어  큰 따옴표 사이.

    $LS   echo "$LS" 의 값을 인쇄합니다 백 슬래시 문자를 해석하는 일부 쉘을 제외하고 LS 로 시작하는 일부 값은 제외 .

    -   printf "$LS" 의 값을 인쇄합니다  퍼센트 또는 백 슬래시 문자를 포함하지 않고 (대부분의 구현에서) LS 로 시작하지 않는 한 .

    - 의 값을 인쇄하려면  정확히 LS 를 사용하십시오 . 마지막에 줄 바꿈을 원하면 printf %s "$LS" 를 사용하십시오. .

    printf '%s\n' "$LS" 참고  일반적으로 현재 디렉토리의 파일 목록이 아닙니다. 파일 이름을 충분히 길들인 경우에만 작동합니다. 파일 이름 목록 (점 파일 제외)을 얻으려면 와일드 카드를 사용해야합니다. $(ls) . 결과는 문자열이 아닌 문자열 목록이므로 문자열 변수에 할당 할 수 없습니다. 배열 변수 * 를 사용할 수 있습니다  그것들을 지원하는 쉘 (ksh93, bash, zsh).

    자세한 내용은 쉘 스크립트가 공백 또는 기타 특수 문자에서 질식하는 이유는 무엇입니까?

  • 답변 # 3

    위에 언급 된

    files=(*)
    
    

    유일한 올바른 해결책입니다.

    printf '%s\n' "$LS" 와 함께 제안 된 다른 솔루션을 보여 드리겠습니다.  그리고 echo 간단히 작동하지 않습니다.

    printf
    
    

    ( $ mkdir t $ cd t $ touch \\n $ LS=$(ls -l) $ echo "$LS" total 0 -rw-r--r-- 1 domain domain 0 Nov 5 06:12 $ printf "$LS\n" total 0 -rw-r--r-- 1 domain domain 0 Nov 5 06:12 $ printf '%s\n' "$LS" total 0 -rw-r--r-- 1 domain domain 0 Nov 5 06:12 \n $ ls -l total 0 -rw-r--r-- 1 domain domain 0 Nov 5 06:12 \n $ rm \\n $ cd .. $ rmdir t $ 로 테스트 가능  및 변형))

    와이즈 비즈  파일 이름에 그렇게 공통적이지 않을 수 있습니다. V=$(printf 'line0:\\n\\n\nline1.\n') printf '%s\n' "$V" 를 저장하십시오.  변수로, 그리고 문자 그대로 \n 가 발생할 가능성  크게 증가합니다.

    git diff

  • 이전 networking - googlecom 우분투 호스트 이름 ping을 확인할 수 없습니다
  • 다음 process - pstree의 한 분기에 sshd가 여러 번 표시되는 이유는 무엇입니까?