パラメータがあり、vale '123'
、、、'234'
を渡します'456'
。
$p='123','234','456'
この値を2つの異なる場所に表示したいと思います。
- 1上記のパラメータを使用します=
'123'
、、、'234'
'456'
- 2番目に同じパラメータを使用し、
$p
出力は次のようになります。
''123'',''234'',''456''
どうすればこれを達成できますか?
事前にありがとう
ベストアンサー1
まず、一重引用符が実際に変数値の一部であることを確認する必要があります。
p="'123','234','456'"
文字列を二重引用符で囲むと、'123','234','456'
シェルが一重引用符を削除できなくなります。二重引用符がない場合、変数の値は文字列に設定されます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//\'/\"}'
値のすべての一重引用符をそれぞれ二重引用符または二重引用符に変更するパラメータ置換の例です$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
)を除く文字で構成されており、パス名が単一の文字列に格納されている場合、あるパス名を別のパス名と区別するのは困難です。
その後、文字列をプレフィックスとサフィックスとして追加して、その配列内の各要素を変更する問題で問題を一般化できます。この一般的な問題の回避策は、シェル関数を介して実行できます。
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""