Chạy một lệnh và sau đó thay thế tham số trong một dòng


7
bash# hostname
host1.example.com

Tôi chỉ muốn host1. Vì thế:

SHORT_HOST=$(/bin/hostname)
SHORT_HOST=${SHORT_HOST%%.*}

Tôi có thể biến điều này thành một lớp lót không? - hoặc - cách tốt nhất để làm cho $ SHORT_HOST chỉ đọc, nhưng vẫn có được tên máy chủ ngắn là gì?

Câu trả lời:


5

Nếu bạn không bị giới hạn chỉ với các công cụ của bash, có thể thử

SHORT_HOST=$(hostname | sed -e 's/\..*//')

hoặc là

SHORT_HOST=$(hostname | cut -d. -f1)

4

Nếu môi trường của bạn hỗ trợ điều này, bạn có thể chỉ cần:

typeset -r SHORT_HOST="$(/bin/hostname -s)"

3

Đây chỉ là một cách khác bằng cách sử dụng awklệnh:

/bin/hostname | awk -F'.' '{print $1}'

và nếu bạn cần lưu trữ nó trong biến SHORT_HOST, hãy sử dụng như sau:

SHORT_HOST=$(/bin/hostname | awk -F'.' '{print $1}')

2

Trong các shell khác với zsh, bạn cần thực hiện một phép gán trung gian bất cứ khi nào bạn muốn thực hiện nhiều phép biến đổi trên một giá trị.

Tất nhiên, đôi khi có một số cách giải quyết, chẳng hạn như chạy lệnh tạo ra kết quả mong muốn mà không cần xử lý hậu kỳ hoặc thực hiện hậu xử lý qua đường ống thông qua một công cụ bên ngoài (giải pháp đường ống sẽ chậm hơn và có nguy cơ xáo trộn dòng mới hơn).

Nếu bạn muốn làm cho biến chỉ đọc, bạn có thể thấy nó sạch hơn để gán cho một biến tạm thời.

tmp=$(/bin/hostname)
typeset -r SHORT_HOST="${tmp%%.*}"

Zsh (nhưng không phải ksh hoặc bash) hỗ trợ thay thế tham số lồng nhau. Ở đó, bạn có thể viết

typeset -r SHORT_HOST=${$(/bin/hostname)%%.*}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.