文件名中带有空格的Linux脚本
我目前正在使用一个供应商提供的软件,该软件试图将附件文件发送到另一个脚本,该脚本将从列出的文件中提取文本。当我们从包含空格的外部源接收文件时,脚本会失败,因为供应商提供的软件没有将文件名括在引号中-这意味着在运行文本提取脚本时,它会收到一个文件名,该文件名将在空格上分开,并导致提取程序脚本出错。我们无法编辑供应商提供的软件 整个过程设计为自动转移,因此,将扳手随机抛入齿轮是一个问题 我们要做的是处理文本提取器脚本中的空格名称,因为这是我们可以控制的部分。在快速Google之后,似乎更改脚本的IFS值将是一个快速的解决方案,但不幸的是,该脚本将在扩展已经破坏了传入数据后生效 我使用的脚本接受a-e值、a-I值和a-o值。这些值是从供应商提供的脚本发送的,我无法对其进行编辑控制文件名中带有空格的Linux脚本,linux,bash,shell,scripting,whitespace,Linux,Bash,Shell,Scripting,Whitespace,我目前正在使用一个供应商提供的软件,该软件试图将附件文件发送到另一个脚本,该脚本将从列出的文件中提取文本。当我们从包含空格的外部源接收文件时,脚本会失败,因为供应商提供的软件没有将文件名括在引号中-这意味着在运行文本提取脚本时,它会收到一个文件名,该文件名将在空格上分开,并导致提取程序脚本出错。我们无法编辑供应商提供的软件 整个过程设计为自动转移,因此,将扳手随机抛入齿轮是一个问题 我们要做的是处理文本提取器脚本中的空格名称,因为这是我们可以控制的部分。在快速Google之后,似乎更改脚本的IF
#!/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种情况: