我正在尝试创建一个执行以下操作的函数
composer config repositories.foo '{"type": "path", "url": "/b/foo-bundle"}'
我从
lb() { composer config repositories.$1 '{"type": "path", "url": "/b/$1-bundle" }' ; }
lb foo
但是因为参数(一个 json 字符串)在单引号内,所以它会生成 $1-bundle 而不是 foo-bundle。
我确信有办法摆脱这种情况,但我似乎无法破解它。
谢谢。
您无法做任何事情来使外壳
$1
在单引号内扩展,单引号就是那么强大。你需要$1
在单引号之外。您可以关闭单引号,双引号$1
并再次打开单引号:$1
您还应该对出现在其他地方的双引号repositories.$1
( )。而不是从字面上将内容嵌入
$1
到您可以使用的json字符串中:您还可以
jq
使用正确的编码生成 json:这样,即使
$1
包含 JSON 语法中的特殊字符,它也能正常工作(而不是 URL 应该发生这种情况)。请注意,
jq
将不能成为 UTF-8 字符一部分的字节转换为�
(U+FFFD替换字符)。JSON 字符串不能保存任意字节序列,只能保存 UTF-8 编码字符。无论如何,在 URL 中,这些字节应该被编码为
%XX
.jq
确实有一个@uri
运算符来对字符串进行 URI 编码,因此您可以这样做:但是,不幸的是,这将在转换为之后应用
�
,因此不会让您正确地对任何字节序列进行 URI 编码(例如那些无法解码为 UTF-8 的字节序列)。您需要在之前完成 URI 编码
jq
。如果使用ksh93
而不是bash
,可以使用它的内置函数来完成,printf
例如:或者您可以使用适当的编程语言,例如
perl
适当ruby
的 URI / JSON 操作模块。当心
ksh93
'sprintf
, likejq
' 的@uri
编码可能是可取/
的%2F
,也可能不是可取的。