And*_*rew 329 bash shell-script
这个问题是我之前问题的续集。该站点上的用户帮助我确定了如何编写一个for遍历字符串值的 bash循环。例如,假设循环控制变量fname遍历字符串"a.txt" "b.txt" "c.txt"。我想echo“是的!” 何时fname具有值"a.txt"or "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
Run Code Online (Sandbox Code Playgroud)
我获得输出:
一个.txt
不!
b.txt
不!
文件
是的!
为什么该if语句在fname具有 value时显然会产生 true "a.txt"?我用|错了吗?
bah*_*mat 548
如果你想说OR使用双管(||)。
if [ "$fname" = "a.txt" ] || [ "$fname" = "c.txt" ]
Run Code Online (Sandbox Code Playgroud)
(使用的原始 OP 代码|只是将左侧的输出通过管道传输到右侧,与任何普通管道的工作方式相同。)
经过多年的评论和误解,请允许我澄清一下。
要做到OR你使用||。
无论您使用[或[[或test或((一切都取决于你需要在个案基础的情况下什么。说在所有情况下都首选其中之一是错误的。有时候[是对的,[[也是错的。但这不是问题所在。OP问为什么|不起作用。答案是因为它应该是||。
jes*_*e_b 138
接受的答案很好,但由于您使用的是 bash,我将添加 bash 解决方案:
if [[ "$fname" == "a.txt" || "$fname" == "c.txt" ]]; then
Run Code Online (Sandbox Code Playgroud)
这记录在 bash 参考手册3.2.4.2 Conditional Constructs
表达式 1 && 表达式 2
如果表达式 1 和表达式 2 都为真,则为真。
表达式 1 || 表达式2
如果表达式 1 或表达式 2 为真,则为真。
&& 和 || 如果 expression1 的值足以确定整个条件表达式的返回值,则运算符不会计算 expression2。
小智 7
您还可以像这样使用 OR 条件
if test "$fname" = "a.txt" || test "$fname" = "c.txt"
Run Code Online (Sandbox Code Playgroud)