我遇到了bash字符串替换的奇怪行为。
我期望在$ r1和$ var上进行相同的替换以产生完全相同的结果。 这两个字符串似乎具有相同的值。
但事实并非如此,我无法理解我所缺少的....
也许是因为存在问题?我只是不知道...我不是纯粹的IT专家,也许对您来说这很明显。
(位于Repl.it链接的底部)
mkdir -p T21805
touch T21805/T21805_SI-GA-D8-BH25N7DSXY_S1_L001_R1_001.fastq.gz
r1=T21805/*R1*
echo $r1;
echo ${r1%%_S1*z}
var=T21805/T21805_SI-GA-D8-BH25N7DSXY_S1_L001_R1_001.fastq.gz
echo ${var%%_S1*z}
echo $r1| hexdump -C
echo $var | hexdump -C
输出:
回显$ r1
T21805 / T21805_SI-GA-D8-BH25N7DSXY_S1_L001_R1_001.fastq.gz
回显$ {r1 %% _ S1 * z}
T21805 / T21805_SI-GA-D8-BH25N7DSXY_S1_L001_R1_001.fastq.gz
回显$ {var %% _ S1 * z}
T21805 / T21805_SI-GA-D8-BH25N7DSXY
回显$ r1 | hexdump -C
00000000 54 32 31 38 30 35 2f 54 32 31 38 30 35 5f 53 49 | T21805 / T21805_SI |
00000010 2d 47 41 2d 44 38 2d 42 48 32 35 4e 37 44 53 58 | -GA-D8-BH25N7DSX |
00000020 59 5f 53 31 5f 4c 30 30 31 5f 52 31 5f 30 30 31 | Y_S1_L001_R1_001 |
00000030 2e 66 61 73 74 71 2e 67 7a 0a
| .fastq.gz。| 0000003a
echo $ var | hexdump -C
00000000 54 32 31 38 30 35 2f 54 32 31 38 30 35 5f 53 49 | T21805 / T21805_SI |
00000010 2d 47 41 2d 44 38 2d 42 48 32 35 4e 37 44 53 58 | -GA-D8-BH25N7DSX |
00000020 59 5f 53 31 5f 4c 30 30 31 5f 52 31 5f 30 30 31 | Y_S1_L001_R1_001 |
00000030 2e 66 61 73 74 71 2e 67 7a 0a
| .fastq.gz。| 0000003a
我有兴趣了解为什么它不起作用,例如,我可以使用sed实现我的愿望输出。
答案 0 :(得分:2)
我在set -xv
之后运行它来查看r1的内容。
$ r1=T21805/*R1*
+ r1='T21805/*R1*'
$ var=T21805/T21805_SI-GA-D8-BH25N7DSXY_S1_L001_R1_001.fastq.gz
+ var=T21805/T21805_SI-GA-D8-BH25N7DSXY_S1_L001_R1_001.fastq.gz
r1
中的$ {r1 %% _ S1 * z}
是T21805 / * R1 *
。
r1
不包括_S1 * z
。
答案 1 :(得分:2)
在分配时不会发生全局扩展。
$ mkdir -p T21805
$ touch T21805/T21805_SI-GA-D8-BH25N7DSXY_S1_L001_R1_001.fastq.gz
$ touch T21805/T21805_SI-GA-D8-BH25N7DSXY_S1_L001_R1_002.fastq.gz
$ r1=T21805/*R1*
$ printf '%s\n' "$r1"
T21805/*R1*
$ printf '%s\n' $r1
T21805/T21805_SI-GA-D8-BH25N7DSXY_S1_L001_R1_001.fastq.gz
T21805/T21805_SI-GA-D8-BH25N7DSXY_S1_L001_R1_002.fastq.gz
在未加引号的 r1
扩展之后发生。当您编写${r1%%_S1*z}
时,r1
的值不包含字符串S1
;只有在之后 ${r1}
展开,您才能与S1
相匹配。
如果设置了 array ,则分配规则将有所不同。全局扩展会在赋值之前 展开,因此您可以对数组的每个 element 进行过滤。
$ r1=( T21805/*R1* )
$ printf '%2\n' "${r1[@]}"
T21805/T21805_SI-GA-D8-BH25N7DSXY_S1_L001_R1_001.fastq.gz
T21805/T21805_SI-GA-D8-BH25N7DSXY_S1_L001_R1_002.fastq.gz
$ printf '%s\n' "${r1[@]%%_S1*z}"
T21805/T21805_SI-GA-D8-BH25N7DSXY
T21805/T21805_SI-GA-D8-BH25N7DSXY