将带引号和双引号的参数传递给 bash 脚本

将带引号和双引号的参数传递给 bash 脚本

此时此刻我有:

#!/bin/bash
screen -p 'ScreenName' -x eval 'stuff '"'"$@"'"'\015'
echo eval 'stuff '"'"$@"'"'\015'

但是当我将我的脚本称为:

# script.sh asd "asd" 'asd'

我的论点通过如下:自闭症谱系障碍 自闭症谱系障碍

我得到输出:

eval stuff 'asd asd asd'\015

我除了一个:自闭症谱系障碍“自闭症谱系障碍”“自闭症谱系障碍”

如何更改我的脚本以传递带有所有引号的整个参数行?

答案1

您的 shell 没有将引号传递给脚本。如果你想传递引号,请用反斜杠转义它们:

# ./script.sh asd \"asd\" \'asd\'

答案2

sh -c "screen -x 'ScreenName' -X eval 'stuff \"$@\"\015'"

答案3

注意:这在普通情况下不起作用但在重击

唯一的解决方案是向您的 shell 表明这些不是语法而是实际内容,如下所示:

script.sh $'asd "asd" \'asd\''
#         ^^          ^    ^ ^
#         ||          |    | |
#         12          3    3 2

1:通过更改字符串的含义来为字符串添加前缀$,允许反斜杠转义引号,cfhttps://unix.stackexchange.com/a/30904/383566
2:将值括在单引号之间,向 shell 表明它必须被视为单个参数
3:反斜杠转义单引号,因为它用作封闭语法(请参阅 2)

证明 :

# defining a function to test
> function count_and_print_args() {  # if not using bash, remove the "function"
        echo $#  # print the number of arguments
        for arg in "$@"  # for each of all arguments
        do
                echo "$arg"  # print the argument on a newline
        done;
}
> count_and_print_args
0
> count_and_print_args a b c
3
a
b
c
> count_and_print_args $'asd "asd" \'asd\''
1
asd "asd" 'asd'

相关内容