결과
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
나의 초기 접근 방식은bash
awk 명령은 함수 로 정의됩니다 ., 작동합니다. 원래 정의한 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[@]}"
예를 들어, 모두 소문자입니다.
grep
grep -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" 키워드를 제거했는데 계속 작동했습니다. - 머리를 긁어보세요. 이것이 누군가의 시간을 낭비했다면 사과드립니다.