bash glob 后替换不起作用?
bash substitution after glob not working?
我遇到了 bash 字符串替换的奇怪行为。
我希望对 $r1 和 $var 进行相同的替换会产生完全相同的结果。
两个字符串似乎具有相同的值。
但事实并非如此,我不明白我错过了什么....
也许是因为 glob?我只是不知道......我不是纯粹的 IT 人员,也许这对你来说是显而易见的。
(下一个Repl.itlink)
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
输出:
echo $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|十六进制转储-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
回声 $var |十六进制转储-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 实现我想要的输出。
我运行它在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 %% _ S1 * z}
的r1
是T21805 / * R1 *
。
r1
不包括_S1 * z
.
全局扩展不会在分配时发生。
$ 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
它发生在 unquoted r1
展开之后。当你写 ${r1%%_S1*z}
时,r1
的值不包含字符串 S1
;只有 在 ${r1}
展开后才有 S1
你可以与之匹配。
如果设置数组,则赋值规则不同。 glob 在 赋值之前展开 ,因此您可以对数组的每个 元素 进行过滤。
$ 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
我遇到了 bash 字符串替换的奇怪行为。
我希望对 $r1 和 $var 进行相同的替换会产生完全相同的结果。 两个字符串似乎具有相同的值。
但事实并非如此,我不明白我错过了什么....
也许是因为 glob?我只是不知道......我不是纯粹的 IT 人员,也许这对你来说是显而易见的。
(下一个Repl.itlink)
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
输出:
echo $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|十六进制转储-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
回声 $var |十六进制转储-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 实现我想要的输出。
我运行它在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 %% _ S1 * z}
的r1
是T21805 / * R1 *
。
r1
不包括_S1 * z
.
全局扩展不会在分配时发生。
$ 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
它发生在 unquoted r1
展开之后。当你写 ${r1%%_S1*z}
时,r1
的值不包含字符串 S1
;只有 在 ${r1}
展开后才有 S1
你可以与之匹配。
如果设置数组,则赋值规则不同。 glob 在 赋值之前展开 ,因此您可以对数组的每个 元素 进行过滤。
$ 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