2017-11-12 1 views
0

내가 최근 쉘에서 코딩에 새로운 오전는 zsh (bash & zsh 사이의 구문 차이가 있는지 확실하지 않습니다) 스위치를 만들어 나는 인쇄하는 함수를 작성하는 것을 시도하고있다 내 컴퓨터에 패키지 & 툴링의 버전. 아래는 제가 지금까지 가지고있는 것입니다. foo --version의 출력이 주석 처리되었습니다.제거/bash는

get_versions() { 
    local brew_version=$(brew --version 2>/dev/null) 
    # Homebrew 1.3.6 
    # Homebrew/homebrew-core (git revision 8b18; last commit 2017-11-10) 
    local create_react_app_version=$(create-react-app --version 2>/dev/null) # 1.4.3 
    local elixir_version=$(elixir --version 2>/dev/null) 
    # Erlang/OTP 20 [erts-9.1.3] [source] [64-bit] [smp:8:8] [ds:8:8:10] [async-threads:10] [hipe] [kernel-poll:false] [dtrace] 
    # 
    # Elixir 1.5.2 
    local git_version=$(git --version 2>/dev/null) # git version 2.15.0 
    local go_version=$(go version 2>/dev/null) # go version go1.9.2 darwin/amd64 
    local hugo_version=$(hugo version 2>/dev/null) # Hugo Static Site Generator v0.30.2 darwin/amd64 BuildDate: 2017-11-10T10:06:36-06:00 
    local mongo_version=$(mongo --version 2>/dev/null) 
    # MongoDB shell version v3.4.10 
    # git version: 078f28920cb24de0dd479b5ea6c66c644f6326e9 
    # OpenSSL version: OpenSSL 1.0.2m 2 Nov 2017 
    # allocator: system 
    # modules: none 
    # build environment: 
    #  distarch: x86_64 
    #  target_arch: x86_64 
    local node_version=$(node --version 2>/dev/null) # v9.1.0 
    local now_version=$(now --version 2>/dev/null) # 8.4.0 
    local npm_version=$(npm --version 2>/dev/null) # 5.5.1 
    local nvm_version=$(nvm --version 2>/dev/null) # 0.33.6 
    local psql_version=$(psql --version 2>/dev/null) # psql (PostgreSQL) 10.1 
    local yarn_version=$(yarn --version 2>/dev/null) # 1.3.2 
    local zsh_version=$(zsh --version 2>/dev/null) # zsh 5.4.2 (x86_64-apple-darwin17.0.0) 

    # echo "brew:----------------- ${brew_version:9}" 
    echo "create-react-app:----- ${create_react_app_version}" 
    echo "elixir:--------------- ${elixir_version:130}" 
    echo "git:------------------ ${git_version:12}" 
    # echo "go:------------------- ${go_version:13}" 
    # echo "hugo:----------------- ${hugo_version:28}" 
    # echo "mongo:---------------- ${mongo_version:23}" 
    echo "node:----------------- ${node_version:1}" 
    echo "now:------------------ ${now_version}" 
    echo "npm:------------------ ${npm_version}" 
    echo "nvm:------------------ ${nvm_version}" 
    echo "psql:----------------- ${psql_version:18}" 
    echo "yarn:----------------- ${yarn_version}" 
    # echo "zsh:------------------ ${zsh_version:4}" 
} 

제 질문은 출력에 원하지 않는 후행 문자열을 처리하는 방법에 관한 것입니다. 나는 정수로 :을 사용하는 것이 JavaScript의 substring()처럼 작용하여 문자열의 지정된 색인에서 시작하는 결과를 산출한다는 것을 알아 냈습니다.

예를 들어 mongo은 출력이 매우 상세합니다. 현재 mongo_version:23을 호출하면 버전 번호가 표시되지만 맞춤 출력에는 원하지 않는 문자열이 많이 남습니다.

첨부 된 이미지는 후행 문자열이있는 변수가있을 때 현재 출력이 어떻게 보이는지 보여줍니다. 당신이 ${var:offset} 구문을 사용으로 확인하는 경우

expected output

unwanted output

답변

2

, 당신은 ${var:offset:length} 구문을 사용할 수 있습니다, 예를 들어,

echo ${mongo_version:23:6} 

3.4.10 
+0

정말 멋지 네요. 그래서 그것은 또한 JS의'substring' 메소드로 동작하여 시작과 끝 인덱스 값을 줄 수 있습니까? 평행선을 그려서 물건을 기억하는 데 도움이됩니다. – rockchalkwushock

+1

@rockchalkwushock 시작 인덱스 값과 길이를 취합니다. 즉, 변수를 0부터 시작하는 문자열로 처리하는 경우 종료 인덱스 값은 'offset + length - 1'입니다. –

+0

도움과 설명에 대해 대단히 감사합니다! – rockchalkwushock

0

가 몽고에서 멀티 라인 출력을 처리하기 위해 인쇄해야합니다, 당신은 builtinread의 장점이 걸릴 수 :

읽기 한 줄과 필드로 휴식 $ IFS의 문자를 구분 기호로 사용합니다 (아래에 명시된 경우는 제외). 첫 번째 필드는 이름에 할당되고 나머지 필드는성에 할당됩니다. name이 생략되면 REPLY가 스칼라에 사용되고 배열에 대해 응답합니다.

function show_mongo_version() { 
    read -r 
    print "mongo version: $REPLY" 
} 

우리는 그냥 그대로,이 코드는 read 어떤 매개 변수 이름이 지정되지 않은 경우 하나의 스칼라 REPLY로 읽어 줄을 저장 read의 행동을 활용하여 읽기 라인을 저장할 때문에

. 또한, 귀하의 예제에 꼭 필요한 것은 아니지만 코드는 -r (원시)으로 읽은 데이터에 대해 수행 할 잠재적 인 사후 처리를 줄입니다.와

테스트를 아웃 : 방금 실제 버전 문자열을 원하는 경우, 공백 행동에 대한 일반적인 분할을 활용하고, 저장,

mongo version: MongoDB shell version v3.4.10 

을 또는 :

show_mongo_version <<-'EOF' 
MongoDB shell version v3.4.10 
git version: 078f28920cb24de0dd479b5ea6c66c644f6326e9 
OpenSSL version: OpenSSL 1.0.2m 2 Nov 2017 
allocator: system 
modules: none 
build environment: 
    distarch: x86_64 
    target_arch: x86_64 
EOF 

취득하는 원하는 배열을 선택한 다음 원하는 비트를 선택하십시오.

function show_mongo_array() { 
    read -rA 
    print "mongo version: $reply[4]" 
} 

받기 :

mongo version: v3.4.10