如何在bash中检查if语句的true/false值



如果传递给脚本./sample12.sh -t,我正试图让下面的选项-t运行,但现在如果我传递选项-s-c./sample12.sh -s 0-9 -c 0-3,我会得到:

[root@usreliance Biorad]# ./sample12.sh -s 0-9 -c 0-3
Total Samples: 374371

输出应该是这样的:

[root@usreliance Biorad]# ./sample12.sh -s 0-9 -c 0-3
Ch0     Ch1     Ch2     Ch3
Sample 0:       0x1a03  0x1a03  0x4a03  0x5703
Sample 1:       0x4b03  0x4403  0x1e03  0x0904
Sample 2:       0x1003  0x1903  0x4003  0xae03
Sample 3:       0x1e03  0x2603  0x3303  0xad03
Sample 4:       0x1003  0x8403  0x4303  0x6203
Sample 5:       0xe003  0x1603  0x3403  0xc403
Sample 6:       0xf802  0x3b03  0x5303  0x6103
Sample 7:       0x1003  0x1503  0x4203  0x5803
Sample 8:       0x2303  0x1f03  0x5703  0x6203
Sample 9:       0x1703  0x7303  0x3103  0x3303

这是我现在陷入困境的状态下的脚本:

#!/usr/bin/env bash
samps=""
chans=""
total=false
while getopts ':c:s:t' opt; do
case $opt in
s) samps="$OPTARG" ;;
c) chans="$OPTARG" ;;
t) total=true ;;
*) printf 'Unrecognized option "%s"n' "$opt" >&2
esac
done
shift $(( OPTIND - 1 ))
if [ $total ]; then
printf "Total Samples: "$(hexdump -v -e '8/1 "%02x " "n"' samples.bin | wc -l)"n"
else {
hexdump -v -e '8/1 "%02x " "n"' samples.bin |
awk -v samps="$samps" -v chans="$chans" '
BEGIN {
# split sample string to arrays using "-" as delimiter
split(samps, srange, "-")
# split channel string
split(chans, crange, "-")
# arbitrary INT_MAX
int_max=2^52
# default 4 channels as per prerequisite example
chan_default=4
# set default samples
if (!srange[1]) srange[1] = 0
if (!srange[2]) srange[2] = int_max
# set default channels
if (!crange[1]) crange[1] = 0
if (!crange[2]) crange[2] = crange[1] + chan_default-1
# print channel header row
printf "tt"
for (i=crange[1]; i<=crange[2]; i++) {
printf("Ch%d%s", i, (i==crange[2]?"n":"t"))
}
}
{
if(NR >= srange[1] + 1 && NR <= srange[2] + 1) {
start=(crange[1] + 1) * 2 - 1
end=(crange[2] + 1 ) * 2
# print sample range
printf("Sample %d:t", NR-1)
# print channel range in sample line
for (i = start; i <= end; i+=2) {
j = i + 1
printf("0x%s%s%s", $i, $j, (i==end||j==end?"n":"t"))
}
}
}
'
}
fi

最简单的修复方法是使用j_b提到的方法,只需使用:

if [[ "$total" == "true" ]]; then

这允许它比较字符串;真";如相对于文字";真";在if语句中。

关于test[[[的区别的一点注记。二进制/bin/test/bin/[都能够比较值和验证文件类型。当bashshzshif语句中遇到这些情况时,它们执行二进制。然而,[[是为bashzsh内置的外壳。shell没有fork()来运行二进制文件。所有的检查都作为内建程序处理。这是一种性能增强,但也可以作为不良输入的安全网。当你知道你的目标是一个支持[[的shell时,就使用它。有趣的是,[也是bash的内置功能。

解决这个问题的另一种方法是研究数字。

total=0
...
t) total=1 ;;
....
if [ $total -gt 0 ]; then

相关内容

  • 没有找到相关文章

最新更新