如果传递给脚本./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/[
都能够比较值和验证文件类型。当bash
、sh
和zsh
在if
语句中遇到这些情况时,它们执行二进制。然而,[[
是为bash
和zsh
内置的外壳。shell没有fork()
来运行二进制文件。所有的检查都作为内建程序处理。这是一种性能增强,但也可以作为不良输入的安全网。当你知道你的目标是一个支持[[
的shell时,就使用它。有趣的是,[
也是bash
的内置功能。
解决这个问题的另一种方法是研究数字。
total=0
...
t) total=1 ;;
....
if [ $total -gt 0 ]; then