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 for
vò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 fname
lặp lặp trên các chuỗi "a.txt" "b.txt" "c.txt"
. Tôi muốn echo
"có!" khi fname
có 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 if
tuyên bố rõ ràng mang lại sự thật khi fname
có 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
-o
trong cùng [ ]
.
@Thor Tôi thích
—
jw013
||
và tách biệt [ ]
hơn -o
về 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ì bash
nó [[
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.