bash 함수에서 소문자 쉘 변수를 보려면 awk를 사용하십시오.

bash 함수에서 소문자 쉘 변수를 보려면 awk를 사용하십시오.

결과

set출력에 표시된 변수를 사용하거나 필터링 declare하여소문자 명명 쉘이것은 테스트할 때 쉘 변수를 설정하는 나의 규칙입니다.

나는 다음을 설정했습니다 :

$ declare -A pid=()
$ a=DHCP
$ something=test

출력이 다음과 같기를 원합니다.

$ lvar
a=DHCP
pids=()
something=test

이 기능을 위해 awk 명령을 생각해 냈습니다 lvar.

declare | awk -F'=' '$1 ~ /^[a-z]+$/'

명령줄에서 실행할 때 훌륭하게 작동합니다. 그러나 소싱되어 실행되는 함수로서 다음으로 인해 발생했다고 생각되는 오류가 발생합니다.awk 필드 매개변수 $1로 설명되었다bash 함수 매개변수.

$ vi func
function lvar() {
  declare |awk -F'=' '$1 ~ /^[a-z]+$/'
}

달리기레발이 오류가 발생합니다.

$ lvar
awk: cmd. line:1:  ~ /^[a-z]+$/
awk: cmd. line:1:  ^ syntax error

내가 여기서 뭘 잘못하고 있는 걸까?

$ declare -p -f lvar
lvar () 
{ 
    declare | awk -F'=' '$1 ~ /^[a-z]+$/'
}

업데이트 1

나의 초기 접근 방식은bashawk 명령은 함수 로 정의됩니다 ., 작동합니다. 원래 정의한 Mac이 아닌 Linux 컴퓨터에서만 작동합니다.

알아내야 해macOS 문제그리고 때가 되면 여기에 여러분 모두를 업데이트할 것입니다.
귀한 시간 내주셔서 정말 감사드립니다 :)

업데이트 2

bash shopt알겠습니다. Linux와 macOS에서 옵션이 다른지 확인했지만 그렇지 않습니다.

Mac에서 iTerm을 열면 기능이 예상대로 작동하지만 Terminal.app에 출력이 표시되지 않습니다.

매우 이상하게도 Terminal.app의 일부 설정에만 해당됩니다. 나는 헤매고 있다.

답변1

를 사용하면 bash다음을 사용하여 변수 이름 목록(선언되지는 않았지만 할당되지 않은 이름)을 배열에 넣을 수 있습니다.

readarray -t Vars < <(compgen -v)

다음을 사용하여 필터링할 수 있습니다 grep.

readarray -t Vars < <(compgen -v | grep -x '[[:lower:]]*') &&
  [ "${#Vars[@]}" -gt 0 ] &&
  declare -p -- "${Vars[@]}"

예를 들어, 모두 소문자입니다.

grepgrep -v '[[:upper:]]'이름에 대문자가 포함된 변수 또는 grep '[[:lower:]]' | grep -v '[[:upper:]]'소문자가 하나 이상 포함되고 대문자가 없는 변수를 제외한 모든 변수에 적용되도록 필터를 변경합니다 .

어쨌든 변수 값은 여러 줄로 구성될 가능성이 높으며 표시되기 declare때문에(적어도) 출력을 한 줄씩 후처리 할 수 없습니다. 스칼라로) posix옵션이 활성화된 경우 예를 들면 다음과 같습니다.bash

var='line 1
line 2'

이 옵션을 비활성화하면 5.1 에서는 각 변수 정의가 한 줄에 있도록 보장하기 때문에 적어도 항상 개행 문자를 렌더링하는 posix것으로 보입니다 .bash$'\n'

이 경우 다음을 수행할 수 있습니다.

(set +o posix; declare | grep -E '^[[:lower:]]+=')

이름이 모두 소문자인 변수의 정의를 나열합니다(변수 값이 충분히 짧거나 바이트 grep보다 큰 줄을 차단하지 않는다고 가정).LINE_MAX

for 와 마찬가지로 compgen -v선언된 할당되지 않은 변수는 포함되지 않습니다.

답변2

그리고 zsh:

set -o extendedglob
typeset -m '[[:lower:]]#'

이름이 모두 소문자로 구성된 변수의 정의를 인쇄합니다.

set -o extendedglob
typeset -m '^*[[:upper:]]*'

대문자를 포함하지 않는 콘텐츠의 경우 foo_bar또는 var1등도 포함합니다.

set -o extendedglob
typeset -m '*[[:lower:]]*~*[[:upper:]]*'

하나 이상의 소문자를 포함하고 대문자는 포함하지 않는 변수의 경우 __이름이 지정된 _123_변수를 제외합니다.편지이전에 비해 소문자나 대문자 형태가 없습니다.

zsh이러한 변수 중 다수가 정의되어 있습니다 .

답변3

좋아, 내 기능 방법이 작동합니다. 일부가 있습니다미친 Terminal.app 문제이는 기능과는 아무런 관련이 없습니다.

에서:

$ vi ~/.bash_functions
lvar() {
  declare |awk -F'=' '$1 ~ /^[a-z]+$/'
}

도착하다:

$ vi ~/.bash_functions
function lvar() {
  declare |awk -F'=' '$1 ~ /^[a-z]+$/'
}

문제를 정확히 찾아낼 수 있었으면 좋겠지만 작동이 시작되었습니다.터미널 프로그램긴 함수를 사용하여 형식을 정의한 후기능키워드는 내 기본 bash 함수 파일에서 Terminal.app을 닫았다가 다시 엽니다. 이봐, 어서 - 성공했어! 그런 다음 기본 bash 함수에서 "function" 키워드를 제거했는데 계속 작동했습니다. - 머리를 긁어보세요. 이것이 누군가의 시간을 낭비했다면 사과드립니다.

관련 정보