2012-04-18 49 views
51

Tôi có một biến Bash, $word, mà đôi khi là một từ hoặc một câu, ví dụ:Cách lấy chữ cái đầu tiên trong biến Bash?

word="tiger" 

Hoặc:

word="This is a sentence." 

Làm thế nào tôi có thể làm cho một biến Bash mới tương đương với chỉ 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:

echo $firstletter 
T 

Trả lời

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

Mỗi khi bạn nói "đầu tiên" trong mô tả vấn đề của bạn, head là một giải pháp có khả năng.

+6

Xin lưu ý rằng không có tùy chọn '-c' trong đầu POSIX: . – gioele

+3

Điều này sẽ trả lại chữ cái đầu tiên, nhưng nó là một 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

+10

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

170
word="tiger" 
firstletter=${word:0:1} 
+3

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

58
word=something 
first=${word::1} 
+1

Điều này sẽ tuyệt vời, nhưng không hiệu quả đối với tôi, không phải trong bash 4.3.11 hay trong zsh 5.0.5 – yoniLavi

+1

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

+1

Cảm ơn Adam, xấu của tôi, tôi không thể tìm ra lý do tại sao nó không làm việc cho tôi trước đây, nhưng nó hoạt động hoàn toàn tốt đẹp trên một số phiên bản của bash tôi đã cố gắng, trở 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

1

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

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

Chơi bằng cách chơi dành cho những người thưởng thức những người (tôi làm!):

{

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

}

Vâng đó là thú vị! :) Bạn cũng có thể sử dụng grep và v.v. nhưng nếu bạn đang ở trong bash thì ma pháp ${x:0:1} vẫn là giải pháp tốt hơn.(Tôi đã dành như một giờ cố gắng sử dụng POSIX mở rộng biến để làm điều đó nhưng không thể :()

+0

Tôi đã đăng giải pháp POSIX tại đây: https://stackoverflow.com/a/44988512/4694621 –

0

Sử dụng bash 4:

x="test" 
read -N 1 var <<< "${x}" 
echo "${var}" 
Các vấn đề liên quan