Có vấn đề với một tập lệnh shell shell ký tự


11

Tôi đang cố gắng tìm hiểu những điều cơ bản và tôi đã gặp phải một vấn đề với kịch bản của mình khi đếm các ký tự của đầu vào của người dùng. Đây là kịch bản của tôi, ai đó có thể chỉ ra tôi đang sai ở đâu không?

#!/bin/bash

echo "Enter a word!"    
read INPUT_STRING   
len= echo $INPUT_STRING | wc -c 
echo "Your character length is " $len
exit

Câu trả lời:


12

mọi khởi đầu đều khó khăn:

#!/bin/bash
read INPUT
echo $INPUT
len=$(echo -n "$INPUT" | LC_ALL=C.UTF-8 wc -m)
echo $len

cụ thể, không được có một không gian xung quanh =và một lệnh riêng biệt cần được đặt bên trong $(...). Ngoài ra, bạn có thể muốn viết các biến của mình trong dấu ngoặc kép "bằng cú pháp này "${INPUT}", điều này đảm bảo rằng biến đó không vô tình được nối với những gì sau đây và có thể chứa các ký tự đặc biệt (ví dụ: dòng mới \n).


1
Cảm ơn bạn mã của tôi hoạt động ngay bây giờ và sự giúp đỡ bổ sung sẽ giúp tôi trong tương lai. Cảm ơn
Jack Slater

@Gnouc Cảm ơn bạn đã chỉnh sửa sâu sắc này! vẫn đang học ...
Sebastian

xin lỗi vì đã tham khảo trong tương lai, bạn có thể cho tôi biết những gì -n làm và LC_ALL = C.UTF-8 vì tôi muốn biết mục đích của nó. Cảm ơn bạn
Jack Slater

1
để tìm ra ý nghĩa của một công tắc dòng lệnh, hãy thử sử dụng manlệnh (trong trường hợp này man echo: -n do not output trailing newline). Yêu cầu thường xuyên mansẽ thúc đẩy các kỹ năng linux của bạn một cách nhanh chóng. Để biết thêm thông tin về LC_ALL, hãy xem câu hỏi / câu trả lời này
Sebastian

1
sao chép từ liên kết: Bạn thường chạy một lệnh với LC_ALL=Cđể tránh các cài đặt của người dùng can thiệp vào tập lệnh của bạn. Chẳng hạn, nếu bạn muốn [a-z]khớp 26 ký tự ASCII từ a đến z, bạn phải đặtLC_ALL=C
Sebastian

8

Tôi nghĩ tốt nhất nên sử dụng

len=${#INPUT_STRING}

nếu không, phần cuối của ký tự được thêm bởi echo cũng sẽ được tính vào. Trừ khi đó là những gì bạn muốn.


Tôi đồng ý, nó ngắn hơn và nhanh hơn.
Franki
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.