Bash (Ubuntu) - Chuỗi trong vòng lặp?


8

Tôi đang cố gắng tạo một vòng lặp while trong bash sẽ không tiếp tục cho đến khi người dùng nhập từ "tiếp theo". Tôi dường như không thể tìm ra cách sử dụng chuỗi cho điều kiện mặc dù.

#Beginning of code
echo -e "Please type next to continue."
read word 
while [ "$word" -ne "next" ]
do 
    read word
done
#the rest of the code

1
khi bạn so sánh các chuỗi bạn nên sử dụng = hoặc ==. Vì vậy, vòng lặp while của bạn sẽ giống như: while [ "$word" = "next" ]-eq được sử dụng để so sánh số
Romeo Ninov

Câu trả lời:


4

Như những người khác đã nói, bạn không nên sử dụng -neso sánh số nguyên để so sánh các chuỗi - thay vào đó bạn nên sử dụng =/!=trong test [ngoặc ]. Tuy nhiên, ngay cả điều đó là dễ vỡ nhất - các chuỗi phải khớp chính xác và '' không bằng nhau ''. Nó thường là tốt hơn để xử lý cases trong bối cảnh đó:

set --
while   read  word
        case $?$#$word            in 
        ($?$#[Nn][Ee][Xx][Tt]) ! :;;
        ([!0]*|05*) ! break       ;;esac
do      set '' "$@"
done   

Đã cung cấp một giá trị mặc định cho $IFS (đáng để xem xét nếu bạn dự định thực hiện shell read) , nó sẽ hoạt động với mọi giá trị trên / dưới của next (nếu bạn yêu cầu) và giữ cho vòng lặp không chạy đi mà không kết thúc.


1
Hmmm ... Bây giờ tôi đang tự hỏi tại sao tôi nghĩ nó nên dễ dàng hơn theo cách khác. Nhưng tôi nghĩ rằng đó là vì tôi đã nghĩ rằng một EOF không nên trả về đúng theo cùng một cách mà 5 lần thất bại liên tiếp sẽ không trở lại đúng.
mikeerv


4

Tôi nghĩ bạn muốn:

echo 'Please type "next" to continue.'
while read word && [ "$word" != next ]; do
  : something in the loop if needed
done

Bạn cũng nên kiểm tra phần cuối của tệp trên stdin (ở đây bằng cách kiểm tra trạng thái thoát của read).


Tôi đã có read ... && caselúc đầu, nhưng có vẻ dễ dàng hơn chỉ để đặt giới hạn thấp vì một vòng lặp đọc tty chạy trốn sẽ khó chịu hơn 5 lần đọc. Tuy nhiên - đó là lười biếng. Tôi cho rằng $?.$#$wordbây giờ tôi có thể làm được điều đó khi tôi nghĩ về nó ...
mikeerv

2

Bạn đang sử dụng toán tử so sánh sai. Bạn nên sử dụng "! =" Cho chuỗi và "-ne" cho số nguyên như sau:

#Beginning of code
echo -e "Please type next to continue."
read word
while [ "$word" != "next" ]
do
    read word
done
#the rest of the code

Kiểm tra trang này: Tập lệnh nâng cao bash: Hoạt động so sánh

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.