这个问题是我的问题的续集先前的问题。该网站上的用户好心地帮助我确定如何编写for
迭代字符串值的 bash 循环。例如,假设循环控制变量fname
对 strings 进行迭代"a.txt" "b.txt" "c.txt"
。我想echo
“是的!”当fname
有值"a.txt"
或"c.txt"
,并且echo
“不!”否则。我尝试过以下 bash shell 脚本:
#!/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
我得到输出:
a.txt
不!
b.txt
不!
c.txt
是的!
为什么该语句在具有值if
时显然会产生 true ?难道是我用错了?fname
"a.txt"
|
答案1
如果你想说OR
使用双管( ||
)。
if [ "$fname" = "a.txt" ] || [ "$fname" = "c.txt" ]
(最初使用的 OP 代码|
只是将左侧的输出通过管道传输到右侧,与任何普通管道的工作方式相同。)
经过多年的评论和误解,请允许我澄清一下。
来做OR
你用的||
。
您是否使用[
or [[
or test
or ((
all 取决于您具体情况的需要。说在所有情况下都首选其中之一是错误的。有时[
是对的,有时[[
是错的。但这不是问题所在。 OP问为什么|
不起作用。答案是因为它应该是||
相反的。
答案2
接受的答案很好,但由于您使用的是 bash,我将添加 bash 解决方案:
if [[ "$fname" == "a.txt" || "$fname" == "c.txt" ]]; then
这在 bash 参考手册中有记录3.2.4.2 条件构造
表达式1 && 表达式2
如果表达式 1 和表达式 2 都为真,则为真。
表达式1 ||表达式2
如果表达式 1 或表达式 2 为真,则为真。
&& 和 ||如果表达式 1 的值足以确定整个条件表达式的返回值,则运算符不会计算表达式 2。
答案3
您还可以像这样使用 OR 条件
if test "$fname" = "a.txt" || test "$fname" = "c.txt"
答案4
你可以像这样使用或调节
if [ "$fname" = "a.txt" -o "$fname" = "c.txt" ]