此时此刻我有:
#!/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'