2012-02-26 25 views
21

Tôi đang viết một tập lệnh yêu cầu số phiên bản bash ở định dạng ngắn đơn giản.Cách nhận số phiên bản bash

Tôi nhận thức được bash --version, nhưng điều này đưa ra một sản lượng dài:

GNU bash, version 4.2.10(1)-release (i686-pc-linux-gnu) 
Copyright (C) 2011 Free Software Foundation, Inc. 
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> 

This is free software; you are free to change and redistribute it. 
There is NO WARRANTY, to the extent permitted by law. 

Điều này có thể được cắt giảm xuống chút tôi muốn, 4.2.10, của thành viên này:

bash --version | grep "bash" | cut -f 4 -d " " | cut -d "-" -f 1 | cut -d "(" -f 1 

Tuy nhiên, điều này có vẻ như nó sẽ dễ bị phá vỡ nếu thông điệp đó đã từng thay đổi một chút vì bất kỳ lý do gì.

Có cách nào tốt hơn để thực hiện việc này hay không và cách này tốt hơn là gì?

Cảm ơn

Trả lời

23

Nếu bạn đang chạy trong một vỏ bash, sau đó biến $BASH_VERSION môi trường nên được thiết lập:

$ echo $BASH_VERSION 
4.2.8(1)-release 

Điều đó sẽ được dễ dàng hơn và đáng tin cậy hơn để phân tích. Xem man page để biết danh sách các biến môi trường do trình bao đặt.

+2

... và với điều đó tôi đã phát hiện ra '$ BASH_VERSINFO' mà tôi có thể xây dựng nó chỉ sử dụng các bit tôi cần, vì lý do nào đó mà trang người dùng trên máy của tôi không có bất kỳ đề cập nào về các biến môi trường mà nó đặt ra. Cảm ơn :) – stwalkerster

3

Dường như có một biến môi trường cho việc này:

echo $BASH_VERSION 

mang

4.1.7(1)-release 

trên máy tính của tôi.

10

Để giải nén phần đầu tiên:

$ echo ${BASH_VERSION%%[^0-9.]*} 
4.2.10 
+2

Chỉ phiên bản chính: 'echo $ {BASH_VERSION %% [^ 0-9] *}' –

+3

'echo $ BASH_VERSINFO' –

15

Ngoài ra còn có một mảng đặc biệt (BASH_VERSINFO) chứa mỗi số phiên bản trong các yếu tố riêng biệt.

if ((BASH_VERSINFO[0] < 3)) 
then 
    echo "Sorry, you need at least bash-3.0 to run this script." 
    exit 1 
fi 

Xem http://www.tldp.org/LDP/abs/html/internalvariables.html để biết thêm:

# Bash version info: 

for n in 0 1 2 3 4 5 
do 
    echo "BASH_VERSINFO[$n] = ${BASH_VERSINFO[$n]}" 
done 

# BASH_VERSINFO[0] = 3      # Major version no. 
# BASH_VERSINFO[1] = 00      # Minor version no. 
# BASH_VERSINFO[2] = 14      # Patch level. 
# BASH_VERSINFO[3] = 1      # Build version. 
# BASH_VERSINFO[4] = release    # Release status. 
# BASH_VERSINFO[5] = i386-redhat-linux-gnu # Architecture 
              # (same as $MACHTYPE). 
0

xây dựng trên bluecat's helpful answer:

Để báo cáo 3 thành phần phiên bản số đầu tiên - ví dụ, 4.2.10 - qua built-in array shell variable BASH_VERSINFO:

$ bash -c 'IFS=.; echo "${BASH_VERSINFO[*]: 0:3}"' 
4.2.10 

Nếu bạn đang gọi tính năng này từ bên một kịch bản Bash, sử dụng một subshell để khoanh vùng ảnh hưởng của thay đổi IFS:

#!/usr/bin/env bash 

ver=$(IFS=.; echo "${BASH_VERSINFO[*]: 0:3}") # -> e.g., $ver == '4.2.10' 

Giải thích:

  • IFS=. đặt tách lĩnh vực nội bộ để ., đảm bảo rằng khi chúng ta in một mảng bên trong một chuỗi được trích dẫn đôi sau, các phần tử của mảng được nối với dấu tách đó.

    • Lưu ý rằng bạn không thể chỉ làm IFS=. echo ... để thoáng qua xác định lại IFS scoped cho lệnh các echo, bởi vì vỏ parameter expansion (sự giãn nở của ${BASH_VERSINFO[*]: 0:3}, trong trường hợp này) xảy ra trướcecho được gọi. Do đó, cần có hai lệnh riêng biệt; việc sử dụng command substitution ($(...)) đảm bảo rằng thay đổi thành IFS vẫn được bản địa hóa, vì lệnh thay thế chạy trong các vỏ con.
  • ${BASH_VERSINFO[*]: 0:3} chiết xuất 3 yếu tố đầu tiên từ mảng biến $BASH_VERSINFO (bắt đầu từ chỉ số 0, trở 3 yếu tố).

    • Lưu ý rằng để cho IFS để làm việc như dự định, chứ không phải là *@ phải được sử dụng để tham khảo mảng; @ sẽ luôn luôn tách riêng các phần tử với một không gian đơn lẻ, bất kể giá trị của $IFS.
1

chạybash --version sau đó sản lượng của nó thích

GNU bash, version 3.2.25(1)-release (x86_64-redhat-linux-gnu) 

hoặc

GNU bash, version 4.1.2(1)-release (x86_64-redhat-linux-gnu) 

hoặc

GNU bash, version 4.3.30(1)-release (x86_64-pc-linux-gnu) 
.

sử dụng bash biến $BASH_VERSION, chạy echo $BASH_VERSION, sản lượng của nó thích

4.3.30(1)-release 

Thường tôi sử dụng lệnh sed để trích xuất các phiên bản không có, đây là lệnh cụ thể:

bash --version | sed -r -n '[email protected]*version (.*)\(1\)-release.*@\[email protected]'

ví dụ:

[[email protected] ~]$ bash --version | sed -r -n '[email protected]*version (.*)\(1\)-release.*@\[email protected]' 
4.2.46 
[[email protected] ~]$ 

echo $BASH_VERSION | sed -r -n '[email protected](.*)\(1\)-release.*@\[email protected]'

ví dụ:

[[email protected] ~]$ echo $BASH_VERSION | sed -r -n '[email protected](.*)\(1\)-release.*@\[email protected]' 
4.2.46 
[[email protected] ~]$ 
Các vấn đề liên quan