매개변수가 있고 vale '123'
, '234'
, 을 전달합니다 '456'
.
$p='123','234','456'
이 값을 서로 다른 두 위치에 표시하고 싶습니다.
- 1 위의 매개변수를 사용하겠습니다 =
'123'
,'234'
,'456'
- 두 번째로 동일한 매개변수를 사용
$p
하고 출력은 다음과 같아야 합니다.
''123'',''234'',''456''
어떻게 이것을 달성할 수 있습니까?
미리 감사드립니다
답변1
먼저 작은따옴표가 실제로 변수 값의 일부인지 확인해야 합니다.
p="'123','234','456'"
문자열을 큰따옴표로 묶으면 '123','234','456'
쉘이 작은따옴표를 제거하지 못하게 됩니다. 큰따옴표가 없으면 변수 값은 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//\'/\"}'
값의 모든 작은따옴표를 각각 큰따옴표 또는 큰따옴표로 변경하는 매개변수 대체의 예입니다 $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""
답변2
노력하다
echo "${p//\'/\'\'}"
''123'',''234'',''456''
당신이 원하는 것을 얻으십시오.