Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
bash脚本预编?文件名_Bash_Shell_Scripting - Fatal编程技术网

bash脚本预编?文件名

bash脚本预编?文件名,bash,shell,scripting,Bash,Shell,Scripting,我正在使用下面的脚本。当我将其echo$f如下所示时,它会给出正确的结果: #/bin/bash var="\/home\/" while read p; do f=$(echo $p | sed "s/${var}/\\n/g") f=${f%.sliced.bam}.fastq echo $f ~/bin/samtools view $p | awk '{print "@"$1"\n"$10"\n+\n"$11}' > $f ./run.sh

我正在使用下面的脚本。当我将其echo
$f
如下所示时,它会给出正确的结果:

#/bin/bash
var="\/home\/"

while read p; do
    f=$(echo $p | sed "s/${var}/\\n/g")
    f=${f%.sliced.bam}.fastq
    echo $f
    ~/bin/samtools view $p | awk '{print "@"$1"\n"$10"\n+\n"$11}' > $f
    ./run.sh $f ${f%.fastq}
    rm ${f%.sliced.bam}.fastq
done < $1
但是由
awk>$f
创建的文件名为

?test.fastq
注意,这里的总体目标是在具有绝对路径的文件中列出的每个文件上运行此循环,然后在本地写入(这就是sed调用的目的)


编辑:直接在命令行上运行(无变量)
samtools|awk
行运行正常。

awk不可能与您的问题有任何关系。shell完全负责文件重定向,因此f中必须有一个奇怪的字符

最有可能的是,您发送到此脚本的任何内容中都包含一个特殊字符(例如,可能是UTF字符,并且您的终端仅显示ASCII)。当您执行echo时,shell不知道如何显示char,并且可能只是将其显示为空白,当您通过ls发送它时(可能会进行着色),它以一种奇怪的方式组合,并最终显示

哦,等等…你为什么要用sed在文件名中换行???这可能是您的问题…请尝试:

sed "s/${var}//g"

为什么要在awk中执行
“\n+\n”
?fastq文件格式有一条+分隔线。awk命令本身会生成一个正确的fastq文件。请尝试将echo更改为:
echo-e“$f”
,这似乎显示了一个预先设置好的换行符,现在该命令将变成
$sh test.sh name(newline)test。fastq
我正在使用一个换行符,因为我从另一个stackoverflow post复制了该代码,而没有理解它。我相信这解决了这个问题。是的……shell非常乐意在文件名中嵌入特殊字符(包括换行符)。回到过去,你经常会把backspace键弄错,在文件中嵌入backspaces(例如my^?^?文件),ls会将其显示为文件(遵守^?作为backspace)…但是文件名真的是'm y CTRL-?CTRL-?如果我是
sed "s/${var}//g"