gpt4 book ai didi

shell - Bourne/POSIX shell 参数拆分

转载 作者:行者123 更新时间:2023-12-04 23:09:11 25 4
gpt4 key购买 nike

假设我有一些可以接受多个选项的实用程序,每个选项后跟一个文件名。例如,我可以将其称为 myutil , myutil -o somefile , myutil -p anotherfile , myutil -o somefile -p anotherfile等.... 我想写一个包装 POSIX shell 脚本,它能够调用 myutil具有任意选项组合(取决于包装器脚本内部的某些条件,这些条件与此问题无关)。

我想过做这样的事情:

#!/bin/sh
file1=somefile
file2=anotherfile

if [ somecriteria = true ]; then
OPT1="-o $file1"
fi

if [ othercriteria = true ]; then
OPT2="-p $file2"
fi

myutil $OPT1 $OPT2

这很好用——只要两个文件名都没有空格:假设两个 if s 是真的, myutil得到 $1 = [-o]、$2 = [somefile]、$3 = [-p] 和 $4 = [anotherfile]。但是,如果有空格,例如,如果 file1="some file" , $1 = [-o], $2 = [some], $3 = [file], etc. 当然,我想要的是 $2 = [some file]。

在 OPT1 和 OPT2 中的文件名周围加上另一组引号无济于事;例如,如果我将其更改为 OPT1="-o \"$file1\"" ,这只会让我得到 $2 = ["some] 和 $3=[file"]。并在对 myutil 的调用中在 $OPT1 和 $OPT2 附近报价也不起作用:如果我这样做,$1 = [-o some file]。

那么,是否有一些技巧可以让这个工作,或者其他一些可以做我想要的方法?我希望它坚持标准的 shell 功能,所以 没有 bash-isms 或 ksh-isms,请 :) 见 this用于描述标准中的内容。

最佳答案

在弄乱了它之后,我发现了另一种似乎可以做我想做的方法:

#!/bin/sh
file1="some file"
file2=anotherfile

if [ somecriteria = true ]; then
OPT1="$file1"
fi

if [ othercriteria = true ]; then
OPT2="$file2"
fi

myutil ${OPT1:+-o "$OPT1"} ${OPT2:+-p "$OPT2"}

如果设置了 ${parameter},则构造 ${parameter:+word} 将被替换为 word;如果它没有设置,它就会消失。所以如果 $OPT1未设置, ${OPT1:+-o "$OPT1"}消失——值得注意的是,它不会在 argv 中变成空字符串.如 $OPT1设置为 some file ,上面的表达式被替换为 -o "some file" , 和 myutil得到 $1 = [-o], $2 = [some file],如我所愿。

请注意 myutil ${OPT1:+-o} "$OPT1" ${OPT2:+-p} "$OPT2"不完全符合我的要求,因为如果 $OPT1未设置, -o消失了,但是 "$OPT1"变成空字符串——$1 = [], $2 = [-p], $3 = [anotherfile]

(根据丹尼斯的建议编辑)

关于shell - Bourne/POSIX shell 参数拆分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4745108/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com