Câu hỏi này là một phần tiếp theo của câu hỏi trước đây của tôi . Người dùng trên trang này vui lòng giúp tôi xác định cách viết một forvòng lặp bash lặp lại trên các giá trị chuỗi. Ví dụ, giả sử rằng một biến điều khiển vòng fnamelặp lặp trên các chuỗi "a.txt" "b.txt" "c.txt". Tôi muốn echo"có!" khi fnamecó giá trị "a.txt"hoặc "c.txt", và echo"không!" nếu không thì. Tôi đã thử tập lệnh bash shell sau:
#!/bin/bash
for fname in "a.txt" "b.txt" "c.txt"
do
echo $fname
if [ "$fname" = "a.txt" ] | [ "$fname" = "c.txt" ]; then
echo "yes!"
else
echo "no!"
fi
done
Tôi có được đầu ra:
a.txt
Không!
b.txt
Không!
c.txt
Đúng!
Tại sao iftuyên bố rõ ràng mang lại sự thật khi fnamecó giá trị "a.txt"? Tôi đã sử dụng |không chính xác?
3
Trong bash, 'hoặc' toán tử là '||' (Kiểu C).
—
Marius Cotofana
Bạn cũng có thể sử dụng
—
Thor
-otrong cùng [ ].
@Thor Tôi thích
—
jw013
||và tách biệt [ ]hơn -ovề tính di động chỉ vì [không được đảm bảo hỗ trợ nhiều hơn 4 đối số. Tất nhiên, nếu ngôn ngữ đích là bash, không ai nên sử dụng [dù sao đi nữa vì bashnó [[vượt trội hơn về nhiều mặt.
@ jw013 Cảm ơn. Điều này có nghĩa là tôi nên sử dụng
—
Andrew
if [[ "$fname" = "a.txt" ]] || [[ "$fname" = "c.txt" ]]chứ không phải if [ "$fname" = "a.txt" ] || [ "$fname" = "c.txt" ]?
@Andrew Điều đó đúng, nếu như bạn đang khai báo shebang như
—
jw013
bash, như bạn đã làm. Một lợi thế của [[nó là nó không thực hiện phân tách từ (trường hợp đặc biệt) nên rất [[ $unquoted_var = string ]]an toàn.