将 echo 输出列表保存到 .txt

将 echo 输出列表保存到 .txt

我在工作中遇到了很多麻烦,试图将一长串回显输出保存为桌面上的 .txt 文件。我在 Yosemite 10.10.4 中使用 Bash。我对 Bash 还很陌生,因此非常感谢任何帮助和提示。

目标是打印每次脑部扫描所使用的协议名称,以获得一长串脑部扫描列表。我使用 for 循环递归地遍历每次大脑扫描,提取所使用的协议,然后回显它以及用于获取该信息的确切文件的路径。

我的脚本:

for i in /Path/to/scans/
do

for file in "$i/"001*/0001.dcm
do

# If there is no such file here, just skip this scan.
if [ ! -f "$file" ]
then
echo "Skipping $i, no 0001.dcm file here" >&2
continue
fi

# Otherwise take the protocol data from scan out
line= dcmdump +P 0040,0254 0001.dcm 
## dcmdump is the command line tool needed to pull out this data. 
## In my case I am saving to variable "line" the protocol used in 
## the scan that this single 0001.dcm file belongs to (scans require 
## many .dcm files but each one contains this kind of meta-data).

# Print the result
echo "$line $file"

break
done
done

所以这个脚本几乎可以工作。在我的终端窗口中,我确实得到了所使用的协议的长列表,以及每次扫描所使用的 0001.dcm 文件的绝对文件路径。

我的问题是,当我将其更改为

echo "$line $file" >> /Users/me/Desktop/scanparametersoutput.txt

我的桌面上显示的文本文件是空白的。有人知道我做错了什么吗?

答案1

您的脚本遇到的一个问题是这一行:

line= dcmdump +P 0040,0254 0001.dcm

dcmdump它不会将的输出分配给,而是使用名为set to 的环境变量来line运行命令。您可以阅读有关此内容的更多信息dcmdumpline''这里

dcmdump因此,您实际看到的是脚本运行的输出,而不是 的输出$line,因为$line没有分配任何内容。

要捕获程序的输出,请使用以下语法

line=$(dcmdump +P 0040,0254 0001.dcm)

=(另请注意,为了安全起见,标志前后没有空格。)

$()在子 shell 中运行括号内的代码,然后用该代码的输出“替换”自身。

您可能也希望0001.dcmdcmdump命令中使用$file它,但我对此并不熟悉,所以我将其留给您。

答案2

正如 rmelcer 提到的,该line变量没有被设置,看起来dcmdump没有在正确的文件上运行:

line=$(dcmdump +P 0040,0254 "$file")

脚本的设置和结构看起来比实际需要的要复杂一些。

path循环不循环,但这可能只是为了你的例子?

您的文件测试不太可能失败,除非您有名为 0001.dcm 的目录(正如您在循环0001.dcm中专门查找的那样for)。

for path in /Path/to/scans/; do
  for file in "$path/"001*/0001.dcm; do

    # If there is no such file here, just skip this scan.
    if [ ! -f "$file" ]; then
      echo "Skipping $file, no 0001.dcm file here" >&2
      continue
    fi

    # Otherwise take the protocol data from scan out
    line=$(dcmdump +P 0040,0254 "$file") 

    # Print the result
    echo "$line $file"

  done
done

如果您可以处理输出中首先出现的文件名,则使用以下命令可能会更简单find

find /Path/to/scans/001* \
  -name 0001.dcm \
  -type f \
  -printf "%p " -exec dcmdump +P 0040,0254 {} + \
| tee /Users/me/Desktop/scanparametersoutput.txt

这会查找名为 0001.dcm ( )/Path/to/scans/001*的文件 ( ),打印出该文件 ( ) 的完整路径,并对文件 ( ) 运行 dcmdump 命令。-type f-name 0001.dcm-printf "%p "-exec xxx {} +

find 命令的输出然后通过管道传输到tee屏幕上并打印到指定的文件 ( /Users/me/Desktop/scanparametersoutput.txt)

相关内容