我有一个参数,我传递了 vale '123'
, '234'
, '456'
。
$p='123','234','456'
我想在两个不同的地方显示这个值。
- 1个地方我将使用上面的参数=
'123'
,'234'
,'456'
- 第 2 个地方我也将使用相同的
$p
参数,我的输出应如下所示。
''123'',''234'',''456''
我怎样才能实现这一目标。
提前致谢
答案1
首先,您必须确保单引号实际上是变量值的一部分:
p="'123','234','456'"
字符串周围的双引号'123','234','456'
可防止 shell 删除单引号。如果没有双引号,变量的值将被设置为 string 123,234,456
。另请注意,要为变量赋值,变量名称之前应加p
no 。$
现在您可以使用单引号输出变量的值,如下所示:
$ printf '%s\n' "$p"
'123','234','456'
您还可以将单引号更改为双单引号来输出,如下所示:
$ printf '%s\n' "${p//\'/\'\'}"
''123'',''234'',''456''
或双引号(这是我认为您在更正问题标记之前想要的):
$ printf '%s\n' "${p//\'/\"}"
"123","234","456"
${p//\'/\'\'}
和位${p//\'/\"}'
是参数替换的示例,它将 value 中的所有单引号更改为双单引号或双引号(分别)$p
。该替换的一般形式如下所示${variable//pattern/string}
。
当您有一个单独的列表时,例如数字 123、234 和 456,存储它们的最佳方法是在数组中:
p=( 123 234 456 1,234 "6'15\"" ) # Added 1,234 an 6'15" as extra elements
这可以避免关于元素构成的任何歧义,特别是如果元素可以包含逗号或引号(如1,234
或中6'15"
)或您稍后想要在每对元素之间添加的任何其他字符。典型的情况可能不是正整数,但如果你发现自己正在处理路径名,这些可能包含任何除了 nul ( \0
) 之外的字符,并且当路径名存储在单个字符串中时区分一个路径名和另一个路径名可能很困难。
然后,您可以将问题概括为涉及通过添加字符串作为前缀和后缀来修改该数组的每个元素的问题。这种普遍问题的解决方案可以通过 shell 函数来执行:
add_flanking_string_to_each () {
# Adds a string to each element in an array,
# both before each and after each element.
# Requires bash 4.3+ for using name references.
# Arg 1: name of input array
# Arg 2: name of output array (will be emptied)
# Arg 3: string
local -n inarray="$1"
local -n outarray="$2"
local string="$3"
local element
outarray=()
for element in "${inarray[@]}"; do
outarray+=( "$string$element$string" )
done
}
然后,您调用此辅助函数来创建您想要的数据:
for string in "'" "''" '"'; do
add_flanking_string_to_each p pnew "$string"
( IFS=','; printf '%s\n' "${pnew[*]}" )
done
这将输出
'123','234','456','1,234','6'15"'
''123'',''234'',''456'',''1,234'',''6'15"''
"123","234","456","1,234","6'15""
答案2
尝试
echo "${p//\'/\'\'}"
''123'',''234'',''456''
得到你想要的东西。