Bash 为需要引号的命令构造参数

Bash 为需要引号的命令构造参数,bash,shell,quotes,Bash,Shell,Quotes,我有一个Bash脚本,它需要调用一个命令,该命令需要为它的一个参数加引号。当我运行命令时 myTimeCommand --time="2018 04 23 1100" -o /tmp/myOutput ~/myInput 在命令行中,它可以正常工作。在我的脚本中,我希望将2018 04 23 1100作为参数传递,并将其直接发送到命令 myScript --time="2018 04 23 1100" 但是,当我尝试此操作时,会收到一条错误消息 ""2018" is not a valid

我有一个Bash脚本,它需要调用一个命令,该命令需要为它的一个参数加引号。当我运行命令时

myTimeCommand --time="2018 04 23 1100" -o /tmp/myOutput ~/myInput
在命令行中,它可以正常工作。在我的脚本中,我希望将2018 04 23 1100作为参数传递,并将其直接发送到命令

myScript --time="2018 04 23 1100"
但是,当我尝试此操作时,会收到一条错误消息

""2018" is not a valid time.
我正在使用getopt解析参数。这是我的剧本

OPTIONS=t:
LONGOPTIONS=time:

PARSED=$(getopt --options=$OPTIONS --longoptions=$LONGOPTIONS --name "$0" -- "$@")
echo ${PARSED}

# read getopt’s output this way to handle the quoting right:
eval set -- "$PARSED"

# now enjoy the options in order and nicely split until we see --
while true; do
    echo "option: ${1}"
    case "$1" in
        -t|--time)
            timeBase="$2"
            timeBase="--time=\"${timeBase}\""
            shift 2
            ;;
        --)
            shift
            break
            ;;
        *)
            echo "Programming error"
            exit 3
            ;;
    esac
done

echo ${timeBase}

myTimeCommand ${timeBase} -o /tmp/myOutput ~/myInput
编辑:删除了runCommand函数。虽然这产生了一些好的评论,但也有损于当前的问题——复制引用的参数以使用命令运行

第二个例子: 文本文件myTest.txt,带有

当我运行grep命令行myTest.txt时,我得到了预期的最后一行。当我将脚本修改为

OPTIONS=s:
LONGOPTIONS=str:

PARSED=$(getopt --options=$OPTIONS --longoptions=$LONGOPTIONS --name "$0" -- "$@")

echo ${PARSED}

# read getopt’s output this way to handle the quoting right:
eval set -- "$PARSED"

# now enjoy the options in order and nicely split until we see --
while true; do
    echo "option: ${1}"
    case "$1" in
        -s|--str)
            sStr="\"$2\""
            shift 2
            ;;
        --)
            shift
            break
            ;;
        *)
            echo "Programming error"
            exit 3
            ;;
    esac
done

echo "grep ${sStr} myTest.txt"

grep ${sStr} myTest.txt
echo按预期显示命令,但实际的grep失败

-bash-4.2~>./extText --str="command line"
grep "command line" myTest.txt
grep: line": No such file or directory

在这种情况下,如何使用在命令行中传递的参数调用grep?

不要在运行命令时使用变量!它们用于保存数据,而不是函数。使用数组

cmdArray=()
cmdArray=( "myTimeCommand" "${timeBase}" "-o" "/tmp/myOutput" "~/myInput" )
并传递带引号的数组以防止分词

runCommand "${cmdArray[@]}"

请参见不要在运行命令时使用变量!它们用于保存数据,而不是函数。使用数组

cmdArray=()
cmdArray=( "myTimeCommand" "${timeBase}" "-o" "/tmp/myOutput" "~/myInput" )
并传递带引号的数组以防止分词

runCommand "${cmdArray[@]}"

请参见

Try with cmd=$printf'myTimeCommand%s-o/tmp/myOutput~/myInput'${timeBase}。使用时基普通值,不添加任何引号。我试图将命令放入变量中,但复杂的情况总是失败@路易斯穆尼奥斯(LuisMuñoz),这与OP的原始代码有着相同的错误——当需要语法引号时,它仍然在生成带有文字引号的字符串;但是,字符串的扩展不会将引号解析为语法,因此字符串扩展中的引号永远不会是语法性的,除非使用eval,使用作为代码传递的字符串调用新的shell,或者使用其他等效方法从一开始就强制重分析,所有这些都会导致更大的问题。@charles duffy,感谢您的澄清。稍后将尝试此功能。请使用cmd=$printf'myTimeCommand%s-o/tmp/myOutput~/myInput'${timeBase}进行尝试。使用时基普通值,不添加任何引号。我试图将命令放入变量中,但复杂的情况总是失败@路易斯穆尼奥斯(LuisMuñoz),这与OP的原始代码有着相同的错误——当需要语法引号时,它仍然在生成带有文字引号的字符串;但是,字符串的扩展不会将引号解析为语法,因此字符串扩展中的引号永远不会是语法性的,除非使用eval,使用作为代码传递的字符串调用新的shell,或者使用其他等效方法从一开始就强制重分析,所有这些都会导致更大的问题。@charles duffy,感谢您的澄清。我稍后会试试这种东西。