Linux/Bash:如何取消报价?
跟随命令Linux/Bash:如何取消报价?,linux,bash,shell,command-line,arguments,Linux,Bash,Shell,Command Line,Arguments,跟随命令 echo 'a b' 'c' 输出 a b c 但是下面 X="'a b' 'c'" echo $X; 会出局的 'a b' 'c' 我正在寻找一种方法来取消引用$X,这样它将输出“abc”,但不会丢失合并的“abb”参数。(=2个参数而不是3个参数,对命令“echo”没有影响,但对其他命令(如“cp”)没有影响。请尝试使用xargs: $ echo $x 'a b' 'c' $ echo $x | xargs ./echo argc = 3 argv[0] = ./echo
echo 'a b' 'c'
输出
a b c
但是下面
X="'a b' 'c'"
echo $X;
会出局的
'a b' 'c'
我正在寻找一种方法来取消引用$X,这样它将输出“abc”,但不会丢失合并的“abb”参数。(=2个参数而不是3个参数,对命令“echo”没有影响,但对其他命令(如“cp”)没有影响。请尝试使用xargs:
$ echo $x
'a b' 'c'
$ echo $x | xargs ./echo
argc = 3
argv[0] = ./echo
argv[1] = a b
argv[2] = c
这是一个棘手的问题,我建议大家围绕这个问题来解决,首先不要把“AB”和“c”连在一起
eval echo $x
这将传递ab
作为第一个参数,传递c
作为第二个参数
注意:这将实际评估参数,例如:
$ x='$((3+5))'
$ eval echo $x
8
如果这不是您想要的,请使用@vanza的xargs
X="'a b' 'c'"
echo $X
eval "echo $X"
使用此代码时,必须小心
X
是否可能包含特殊字符,如\“$
或反勾号。您确定echo
在echo$X
中接收2个参数吗?对于我,它接收3个参数。让我们尝试一下:
X="'a b' 'c'"
function f(){ echo $#; echo $1; echo $2; echo $3; }
f $X
显示:
3
'a
b'
'c'
这三个参数是'a
,b'
和'c'
。我认为这不是您所期望的
如果要生成多参数变量,请将IFS设置为不使用的字符(可能是
),并将其用作变量中的参数分隔符:
X="a b|c"
IFS="|"
function f(){ echo $#; echo $1; echo $2; }
f $X
通常,如果您试图在单个变量中存储多个“单词”,建议的方法不是使用嵌入引号,而是使用数组:
X=('a b' 'c')
printf "%s\n" "${X[@]}"
印刷品:
a b
c
还可以组合
xargs
和sh-c'cmd'\uu1 arg2…
将参数重新分析到位置参数数组$@
例如,将输出分配给变量并将最后一个进程的退出状态$?
重定向到stderr
,可以将最后一个进程的退出代码存储在变量中,并在xargs
结束执行后使用它
X="'a b' 'c'"
ret="$(
export IFS=''
set -o pipefail
echo $X | xargs sh -c '
for file in "$@"; do
echo cp "$file" destdir 1>&2 || { echo $?; kill -HUP $PPID; exit $?; }
#(exit 3) || { echo $?; kill -HUP $PPID; exit $?; }
#(exit 3) || { echo $?; kill -HUP $PPID; kill -HUP -- -$$; }
done
echo $?
' _
echo $? '|' ${PIPESTATUS[@]} 1>&2
)"
echo "$ret" | tail -1
请不要将eval用于此类操作。
set
将保持参数的完整性,echo
以外的命令将很好地使用它们。请记住,您将丢失对任何当前位置参数的引用
set -- "a b" "c"
echo "$@"
#a b c
echo $1
#a b
echo $2
#c
echo${X//\'/};//a b cThanks。我还没有使用“eval”,但根据脚本注入,xargs似乎更安全。注意:xargs无法返回进程的退出状态。任何错误1-125都将显示为123。(可能没有解决方法可用)我可能会使用eval,以使用exitcode