bash shell 脚本:条件字符串连接
bash shell scripting: conditional string concatenation
我想有条件地将文本提交到另一个 shell 脚本中。意思是我想在 deb=1 的情况下用 "INFO":
替换 "WARNING"
#!/usr/bin/env bash
...
if [[ $abc -lt 98 ]] || [[ $deb -eq 1 ]]
then
./discord.sh --webhook-url=$url --text "WARNING: $abc"
fi
我也想避免另一个完整的 IF 语句。我希望有类似
的东西
deb=1 ? "INFO" : "WARNING"
有用吗?如果是,完整的陈述会是什么样子? "--文本 ..."
提前致谢。
你的意思是这样的?
[[ $abc -lt 98 ]] && {
./discord.sh --webhook-url=$url --text "$([[ $deb -eq 1 ]] && echo "INFO" || echo "WARNING"): $abc"
}
将此视为 if
then
else
fi
的替代方法(大括号仅在您有更多命令时才需要,但我喜欢使用无论如何,为了可读性(在某些情况下)。
基本上是
[[ condition ]] && { commands if true } || { commands if false }
你要不要试试:
if (( abc < 98 || deb == 1 )); then
loglevel=$( (( deb == 1 )) && echo "INFO" || echo "WARNING" )
./discord.sh --webhook-url=$url --text "$loglevel: $abc"
fi
可以使用数组索引来匹配带有名称字符串的数字日志级别:
#!/usr/bin/env bash
url=https://example.com/hook
logLevel=(WARNING INFO)
for abc in 97 98; do
for deb in 0 1; do
printf 'abc=%d, deb=%d:\n' $abc $deb
(((i = 1 == deb) || 98 > abc)) &&
echo ./discord.sh --webhook-url=$url --text "${logLevel[i]}: $abc"
done
done
输出:
abc=97, deb=0:
./discord.sh --webhook-url=https://example.com/hook --text WARNING: 97
abc=97, deb=1:
./discord.sh --webhook-url=https://example.com/hook --text INFO: 97
abc=98, deb=0:
abc=98, deb=1:
./discord.sh --webhook-url=https://example.com/hook --text INFO: 98
恕我直言,@tshiono 的回答是最好的。但是,read/debug.
变得很难了
为什么不使用详细的解决方案?
当两个条件都为真时,您想使用 INFO 登录。
if ((deb==1 )); then
./discord.sh --webhook-url="$url" --text "INFO: $abc"
elif ((abc < 98)); then
./discord.sh --webhook-url="$url" --text "WARNING: $abc"
fi
我想有条件地将文本提交到另一个 shell 脚本中。意思是我想在 deb=1 的情况下用 "INFO":
替换 "WARNING"#!/usr/bin/env bash
...
if [[ $abc -lt 98 ]] || [[ $deb -eq 1 ]]
then
./discord.sh --webhook-url=$url --text "WARNING: $abc"
fi
我也想避免另一个完整的 IF 语句。我希望有类似
的东西deb=1 ? "INFO" : "WARNING"
有用吗?如果是,完整的陈述会是什么样子? "--文本 ..."
提前致谢。
你的意思是这样的?
[[ $abc -lt 98 ]] && {
./discord.sh --webhook-url=$url --text "$([[ $deb -eq 1 ]] && echo "INFO" || echo "WARNING"): $abc"
}
将此视为 if
then
else
fi
的替代方法(大括号仅在您有更多命令时才需要,但我喜欢使用无论如何,为了可读性(在某些情况下)。
基本上是
[[ condition ]] && { commands if true } || { commands if false }
你要不要试试:
if (( abc < 98 || deb == 1 )); then
loglevel=$( (( deb == 1 )) && echo "INFO" || echo "WARNING" )
./discord.sh --webhook-url=$url --text "$loglevel: $abc"
fi
可以使用数组索引来匹配带有名称字符串的数字日志级别:
#!/usr/bin/env bash
url=https://example.com/hook
logLevel=(WARNING INFO)
for abc in 97 98; do
for deb in 0 1; do
printf 'abc=%d, deb=%d:\n' $abc $deb
(((i = 1 == deb) || 98 > abc)) &&
echo ./discord.sh --webhook-url=$url --text "${logLevel[i]}: $abc"
done
done
输出:
abc=97, deb=0:
./discord.sh --webhook-url=https://example.com/hook --text WARNING: 97
abc=97, deb=1:
./discord.sh --webhook-url=https://example.com/hook --text INFO: 97
abc=98, deb=0:
abc=98, deb=1:
./discord.sh --webhook-url=https://example.com/hook --text INFO: 98
恕我直言,@tshiono 的回答是最好的。但是,read/debug.
变得很难了
为什么不使用详细的解决方案?
当两个条件都为真时,您想使用 INFO 登录。
if ((deb==1 )); then
./discord.sh --webhook-url="$url" --text "INFO: $abc"
elif ((abc < 98)); then
./discord.sh --webhook-url="$url" --text "WARNING: $abc"
fi