这个问题是我先前提出的问题的后遗症。该站点上的用户好心地帮助我确定了如何编写一个for
遍历字符串值的bash 循环。例如,假设循环控制变量fname
遍历string "a.txt" "b.txt" "c.txt"
。我想echo
“是!” when fname
具有值"a.txt"
or "c.txt"
,并且为echo
“ no!” 除此以外。我已经尝试了以下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
当fname
有值时语句显然产生true "a.txt"
?我使用|
不正确吗?
3
在bash中,“或”运算符为“ ||” (C风格)。
—
Marius Cotofana 2012年
您也可以
—
2012年
-o
在同一个内使用[ ]
。
@Thor我宁愿
—
2012年
||
和分离[ ]
了-o
简单的便携性,因为[
不能保证支持超过4个参数。当然,如果目标语言是bash
,则[
无论如何都不会使用,因为bash
s [[
在许多方面都比较优越。
@ jw013谢谢。这是否意味着我应该使用
—
安德鲁(Andrew)
if [[ "$fname" = "a.txt" ]] || [[ "$fname" = "c.txt" ]]
而不是if [ "$fname" = "a.txt" ] || [ "$fname" = "c.txt" ]
?
@Andrew是正确的,如果您已经像在声明shebang为
—
2012年
bash
那样。[[
它的优点之一是它不进行单词拆分(特殊情况),因此[[ $unquoted_var = string ]]
很安全。