Làm cách nào để lấy được chữ cái đầu tiên trong biến Bash?


88

Tôi có một biến Bash, $wordđôi khi là một từ hoặc câu, ví dụ:

word="tiger"

Hoặc là:

word="This is a sentence."

Làm cách nào để tạo một biến Bash mới chỉ bằng chữ cái đầu tiên được tìm thấy trong biến? Ví dụ, ở trên sẽ là:

echo $firstletter
t

Hoặc là:

echo $firstletter
T

Câu trả lời:


37
initial="$(echo $word | head -c 1)"

Mỗi khi bạn nói "đầu tiên" trong mô tả vấn đề của mình, đó headlà một giải pháp khả dĩ.


8
Xin lưu ý rằng không có -ctùy chọn trong phần đầu POSIX: < unix.com/man-page/posix/1/head >.
gioele

9
Điều này trả về ký tự đầu tiên, nhưng đó là một sự quá mức cần thiết và giải pháp phụ thuộc vào các tiện ích bên ngoài (đầu). Điều này có thể được thực hiện trong vỏ tinh khiết, đó là sạch hơn.
automatthias

26
Đây không phải là câu trả lời được chấp nhận, vì những lý do được chỉ ra bởi các ý kiến ​​trên. Câu trả lời thực sự ở bên dưới - ${word:0:1}hoặc ${word::1}.
noamtm

Đối với việc tuân thủ POSIX, bạn có thể làm echo "$word" | fold -w1 | head -n 1, printf '%.1s' "$X"hoặc printf '%c' "$X"nhưng tất cả những điều này đều phải tuân theo những bí ẩn ký tự v. Nhiều byte.
phicr

Chờ đã, rất head -c ntiếc. echo "fábio" | head -c 2cho f� , vì vậy đó là một vấn đề khác với điều này tôi đoán.
phicr

281
word="tiger"
firstletter=${word:0:1}

9
Chính xác những gì tôi đang tìm kiếm. Một lớp lót, không sinh sản phụ. Hãy bỏ phiếu của tôi!
Tihomir Mitkov

73
word=something
first=${word::1}

1
Điều này sẽ thật tuyệt vời, nhưng không hiệu quả với tôi, không phải trong bash 4.3.11 cũng không phải trong zsh 5.0.5
yoniLavi

1
Với GNU bash v4.3.11, firstđược đặt thành chữ cái s. Bạn có thể xem nó với echo $s. Nếu điều đó không hiệu quả với bạn và bạn muốn được trợ giúp gỡ lỗi, vui lòng sao chép và dán (các) lệnh bạn đã nhập và đầu ra của chúng.
Adam Liss,

2
Cảm ơn Adam, tôi không biết tại sao nó không hoạt động với tôi trước đây, nhưng nó hoạt động hoàn toàn tốt trên một số phiên bản bash mà tôi đã thử, quay lại GNU bash, v3.1.0. Vẫn không hoạt động trong zsh, nhưng câu hỏi được gắn thẻ "bash", vì vậy điều đó không liên quan.
yoniLavi,

Cảm ơn đã theo dõi và xác nhận! Rất vui vì nó có hiệu quả với bạn.
Adam Liss



2

Vì bạn có một sedthẻ ở đây là một sedcâu trả lời:

echo "$word" | sed -e "{ s/^\(.\).*/\1/ ; q }"

Chơi bằng cách chơi cho những người thích những (Tôi làm!):

{

  • s: bắt đầu thói quen thay thế
    • /: Bắt đầu chỉ định những gì sẽ được thay thế
    • ^\(.\): bắt ký tự đầu tiên trong Nhóm 1
    • .*:, đảm bảo phần còn lại của dòng sẽ thay thế
    • /: bắt đầu chỉ định thay thế
    • \1: insert Group 1
    • /: Phần còn lại bị loại bỏ;
  • q: Thoát sedđể nó không lặp lại khối này cho các dòng khác nếu có.

}

Thật là vui! :)Bạn cũng có thể sử dụng grepvà vv nhưng nếu bạn đang ở trong bashcác ${x:0:1}phép thuật vẫn là giải pháp tốt hơn imo. (Tôi đã dành hơn một giờ để cố gắng sử dụng mở rộng biến POSIX để làm điều đó nhưng không thể :( )


1

Sử dụng bash 4:

x="test"
read -N 1 var <<< "${x}"
echo "${var}"
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.