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
文件名中带有空格的Linux脚本_Linux_Bash_Shell_Scripting_Whitespace - Fatal编程技术网

文件名中带有空格的Linux脚本

文件名中带有空格的Linux脚本,linux,bash,shell,scripting,whitespace,Linux,Bash,Shell,Scripting,Whitespace,我目前正在使用一个供应商提供的软件,该软件试图将附件文件发送到另一个脚本,该脚本将从列出的文件中提取文本。当我们从包含空格的外部源接收文件时,脚本会失败,因为供应商提供的软件没有将文件名括在引号中-这意味着在运行文本提取脚本时,它会收到一个文件名,该文件名将在空格上分开,并导致提取程序脚本出错。我们无法编辑供应商提供的软件 整个过程设计为自动转移,因此,将扳手随机抛入齿轮是一个问题 我们要做的是处理文本提取器脚本中的空格名称,因为这是我们可以控制的部分。在快速Google之后,似乎更改脚本的IF

我目前正在使用一个供应商提供的软件,该软件试图将附件文件发送到另一个脚本,该脚本将从列出的文件中提取文本。当我们从包含空格的外部源接收文件时,脚本会失败,因为供应商提供的软件没有将文件名括在引号中-这意味着在运行文本提取脚本时,它会收到一个文件名,该文件名将在空格上分开,并导致提取程序脚本出错。我们无法编辑供应商提供的软件

整个过程设计为自动转移,因此,将扳手随机抛入齿轮是一个问题

我们要做的是处理文本提取器脚本中的空格名称,因为这是我们可以控制的部分。在快速Google之后,似乎更改脚本的IFS值将是一个快速的解决方案,但不幸的是,该脚本将在扩展已经破坏了传入数据后生效

我使用的脚本接受a-e值、a-I值和a-o值。这些值是从供应商提供的脚本发送的,我无法对其进行编辑控制

#!/bin/bash

usage() { echo "Usage: $0 -i input -o output -e encoding" 1>&2; exit 1; }

while getopts ":o:i:e:" o; do
    case "${o}" in
        i)
            inputfile=${OPTARG}
            ;;
        o)
            outputfile=${OPTARG}
            ;;
        e)
            encoding=${OPTARG}
            ;;
        *)
            usage
            ;;
    esac
done
shift $((OPTIND-1))

...
...
<Uses the inputfile, outputfile, and encoding variables>
#/bin/bash
用法(){echo“用法:$0-i输入-o输出-e编码“1>&2;退出1;}
而getopts:o:i:e:o;做
中的大小写“${o}”
(一)
inputfile=${OPTARG}
;;
o)
outputfile=${OPTARG}
;;
(e)
编码=${OPTARG}
;;
*)
用法
;;
以撒
完成
班次$((可选ND-1))
...
...

我承认,我可能不完全理解其中的某些部分,这可能是一个简单的修复,但我的最终目标是能够提取-o、-I和-e,它们都包含1个值,而不管每个部分中的空格。在提取文件名值后,我可以处理引用脚本的问题。

您发布的脚本片段在参数中没有空格问题

例如,以下内容不需要引用(因为这是一项作业):

脚本中
$inputfile
的所有其他用法都应使用双引号

重要的是如何调用此脚本

这将失败,并且只将
hello
分配给变量
inputfile

$ ./script.sh -i hello world.txt
$ ./script.sh -i "hello world.txt"
字符串
world.txt
将提示
getopts
函数停止处理命令行,脚本将继续执行
shift
world.txt
将保留在
$1
中)

以下内容将正确地将字符串
hello world.txt
分配给
inputfile

$ ./script.sh -i hello world.txt
$ ./script.sh -i "hello world.txt"
当然

$ ./script.sh -i hello\ world.txt

您发布的脚本片段与参数中的空格没有任何问题

例如,以下内容不需要引用(因为这是一项作业):

脚本中
$inputfile
的所有其他用法都应使用双引号

重要的是如何调用此脚本

这将失败,并且只将
hello
分配给变量
inputfile

$ ./script.sh -i hello world.txt
$ ./script.sh -i "hello world.txt"
字符串
world.txt
将提示
getopts
函数停止处理命令行,脚本将继续执行
shift
world.txt
将保留在
$1
中)

以下内容将正确地将字符串
hello world.txt
分配给
inputfile

$ ./script.sh -i hello world.txt
$ ./script.sh -i "hello world.txt"
当然

$ ./script.sh -i hello\ world.txt

下面的脚本使用awk分割参数,同时在文件名中包含空格。参数可以是任意顺序。它不处理参数中的多个连续空格,而是将它们折叠为一个

#!/bin/bash

IFS=' '
str=$(printf "%s" "$*")

istr=$(echo "${str}" | awk 'BEGIN {FS="-i"} {print $2}' | awk 'BEGIN {FS="-o"} {print $1}' | awk 'BEGIN {FS="-e"} {print $1}')
estr=$(echo "${str}" | awk 'BEGIN {FS="-e"} {print $2}' | awk 'BEGIN {FS="-o"} {print $1}' | awk 'BEGIN {FS="-i"} {print $1}')
ostr=$(echo "${str}" | awk 'BEGIN {FS="-o"} {print $2}' | awk 'BEGIN {FS="-e"} {print $1}' | awk 'BEGIN {FS="-i"} {print $1}')

inputfile=""${istr}""
outputfile=""${ostr}""
encoding=""${estr}""

# call the jar

调用jar时出现了一个问题,其中Java对带有空格的文件名抛出了一个格式错误的异常。

以下脚本使用awk分割参数,同时在文件名中包含空格。参数可以是任意顺序。它不处理参数中的多个连续空格,而是将它们折叠为一个

#!/bin/bash

IFS=' '
str=$(printf "%s" "$*")

istr=$(echo "${str}" | awk 'BEGIN {FS="-i"} {print $2}' | awk 'BEGIN {FS="-o"} {print $1}' | awk 'BEGIN {FS="-e"} {print $1}')
estr=$(echo "${str}" | awk 'BEGIN {FS="-e"} {print $2}' | awk 'BEGIN {FS="-o"} {print $1}' | awk 'BEGIN {FS="-i"} {print $1}')
ostr=$(echo "${str}" | awk 'BEGIN {FS="-o"} {print $2}' | awk 'BEGIN {FS="-e"} {print $1}' | awk 'BEGIN {FS="-i"} {print $1}')

inputfile=""${istr}""
outputfile=""${ostr}""
encoding=""${estr}""

# call the jar

调用jar时出现了一个问题,Java在一个带有空格的文件名上抛出了一个错误的异常。因此,在阅读了注释之后,我们决定,尽管这可能不是每个场景的正确答案,但对于这个特定场景,正确的答案是手动提取片段

因为我们正在为传递给它的预构建脚本构建此脚本,并且我们不会很快更新该脚本,所以我们可以肯定地接受,此脚本将始终接收-i、-o和-e标志,并且它们之间将有空格,这将导致传递的所有片段都存储在
$*
中的不同变量中

我们可以假设一个标志后的文本是对该标志的响应,直到引用另一个标志为止。这给我们留下了3种情况:

  • 变量包含一个标志
  • 变量包含紧跟在标志之后的第一个参数
  • 变量包含参数的第2+部分,名称中的空格被解释为拆分,需要重新插入
  • 我一直遇到的另一个问题是,试图使字符串文字与IF语句中的变量相等。为了解决这个问题,我将所有相关数据预先存储在数组变量中,以便测试$variable==$otherVariable

    虽然我不期望它会改变,但我们也处理了如果三个标志以不同于我们预期的顺序出现时该怎么办(我们的假设是它们列为I、o、e…但我们无法很好地看到传递了什么)。参数按读取顺序转储到数组中,并行数组跟踪插槽0、1、2中的项是否与i、o、e相关

    最终的结果仍然有一个缺陷:如果文件名中有多个连续的空格,则在处理之前会对空格进行修剪,而