2012-03-15 37 views
24

Tiếp theo kịch bản shell mà tôi đang thực hiệnShell Script, đọc trên cùng một dòng sau khi nhắc lại một thông điệp

#!/bin/sh 

echo "Enter [y/n] : " 
read opt 

đầu ra của nó là

Enter [y/n] : 
Y 

Tôi muốn rằng biến cần được đọc trên cùng dòng như bên dưới

Enter [y/n] : Y 

Nên đơn giản tôi đoán, nhưng tôi mới làm quen với việc viết mã.

+0

@Aaron Cám ơn định dạng bài đăng. Đó là bài viết đầu tiên của tôi. Tôi sẽ đảm bảo rằng các bài đăng khác của tôi được định dạng tốt. – user1263746

+0

Bạn được chào đón :-) –

Trả lời

26

Các công việc #!/bin/sh có nghĩa là bạn đang viết mã cho một trong hai vỏ lịch sử Bourne (vẫn còn được tìm thấy trên một số hệ thống như Solaris tôi nghĩ), hoặc nhiều khả năng, ngôn ngữ shell tiêu chuẩn theo quy định của POSIX. Điều này có nghĩa là read -pecho -n đều không đáng tin cậy.

Các giải pháp tiêu chuẩn/di động là:

printf 'Enter [y/n] : ' 
read -r opt 

(Các -r ngăn ngừa sự đối xử đặc biệt của \, vì read thường chấp nhận đó như là một tự tiếp tục dòng khi nó ở phần cuối của một dòng.)

Nếu bạn biết rằng tập lệnh của mình sẽ được chạy trên các hệ thống có Bash, bạn có thể thay đổi shebang thành #!/bin/bash (hoặc #!/usr/bin/env bash) và sử dụng tất cả các tính năng Bash ưa thích. (Nhiều hệ thống đã /bin/sh symlinked để bash để nó hoạt động một trong hai cách, nhưng dựa vào đó là thói quen xấu, và bash thực sự vô hiệu hóa một số tính năng riêng của mình khi thực hiện dưới cái tên sh.)

+1

Đó là một lời giải thích tuyệt vời và rất rõ ràng. Tôi đang ở trên RHEL 5,5 BTW. – user1263746

29

Giải pháp: read -p "Enter [y/n] : " opt

Từ help read:

-p prompt output the string PROMPT without a trailing newline before 
     attempting to read 
+0

Hoạt động hoàn hảo. Cảm ơn bạn đã giải thích về chuyển đổi -p. – user1263746

6
echo -n "Enter [y/n] : " ; read opt 

HAY! (Sau này là tốt hơn)

read -p "[y/n]: " opt 
+0

Hoạt động tuyệt vời, Cảm ơn! – user1263746

Các vấn đề liên quan