Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux/Bash:如何取消报价?_Linux_Bash_Shell_Command Line_Arguments - Fatal编程技术网

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