Bash에서 함수 인수로 공백이 있는 문자열 전달
공백이 포함된 문자열을 Bash 스크립트의 함수에 전달해야 하는 Bash 스크립트를 작성하고 있습니다.
예:
#!/bin/bash
myFunction
{
echo $1
echo $2
echo $3
}
myFunction "firstString" "second string with spaces" "thirdString"
실행 시 예상되는 출력은 다음과 같습니다.
firstString
second string with spaces
thirdString
그러나 실제로 출력되는 것은 다음과 같습니다.
firstString
second
string
Bash의 함수에 공백이 있는 문자열을 단일 인수로 전달하는 방법이 있습니까?
따옴표를 추가해야 하며 함수 선언이 잘못되었습니다.
myFunction()
{
echo "$1"
echo "$2"
echo "$3"
}
그리고 다른 사람들처럼, 그것은 저에게도 효과가 있습니다.
또 은 각 로 표시되는 입니다.\$에 그런다음함사니다용합서에수▁function▁use다▁theneval변수를 읽고 예상대로 출력합니다.
#!/usr/bin/ksh
myFunction()
{
eval string1="$1"
eval string2="$2"
eval string3="$3"
echo "string1 = ${string1}"
echo "string2 = ${string2}"
echo "string3 = ${string3}"
}
var1="firstString"
var2="second string with spaces"
var3="thirdString"
myFunction "\${var1}" "\${var2}" "\${var3}"
exit 0
출력은 다음과 같습니다.
string1 = firstString
string2 = second string with spaces
string3 = thirdString
이와 유사한 문제를 해결하기 위해 저는 UNIX의 문제에 부딪혔는데, 제 변수들이 공간으로 구분되어 있다고 생각했습니다.로 구분된 .awk나중에 보고서를 만드는 데 사용되는 일련의 변수를 설정합니다.처음에 ghostdog74에서 게시한 솔루션을 시도했지만 모든 매개 변수가 견적으로 전달되지 않아 작동하지 않았습니다.각 파라미터에 이중 따옴표를 추가한 후 예상대로 작동하기 시작했습니다.
아래는 내 코드의 이전 상태이며 완전히 작동하는 이후 상태입니다.
이전 - 작동하지 않는 코드
#!/usr/bin/ksh
#*******************************************************************************
# Setup Function To Extract Each Field For The Error Report
#*******************************************************************************
getField(){
detailedString="$1"
fieldNumber=$2
# Retrieves Column ${fieldNumber} From The Pipe Delimited ${detailedString}
# And Strips Leading And Trailing Spaces
echo ${detailedString} | awk -F '|' -v VAR=${fieldNumber} '{ print $VAR }' | sed 's/^[ \t]*//;s/[ \t]*$//'
}
while read LINE
do
var1="$LINE"
# Below Does Not Work Since There Are Not Quotes Around The 3
iputId=$(getField "${var1}" 3)
done<${someFile}
exit 0
애프터 - 기능 코드
#!/usr/bin/ksh
#*******************************************************************************
# Setup Function To Extract Each Field For The Report
#*******************************************************************************
getField(){
detailedString="$1"
fieldNumber=$2
# Retrieves Column ${fieldNumber} From The Pipe Delimited ${detailedString}
# And Strips Leading And Trailing Spaces
echo ${detailedString} | awk -F '|' -v VAR=${fieldNumber} '{ print $VAR }' | sed 's/^[ \t]*//;s/[ \t]*$//'
}
while read LINE
do
var1="$LINE"
# Below Now Works As There Are Quotes Around The 3
iputId=$(getField "${var1}" "3")
done<${someFile}
exit 0
보다 동적인 방법은 다음과 같습니다.
function myFunction {
for i in "$*"; do echo "$i"; done;
}
이 문제에 대한 가장 간단한 해결책은 사용하기만 하면 되는 것입니다.\"스크립트를 할 때 : " " " " " 은 다음과 같습니다.
#!/bin/bash
myFunction() {
echo $1
echo $2
echo $3
}
myFunction "firstString" "\"Hello World\"" "thirdString"
내 함수에 대한 정의가 잘못되었습니다.다음과 같아야 합니다.
myFunction()
{
# same as before
}
또는:
function myFunction
{
# same as before
}
어쨌든, Bash 3.2.48에서는 괜찮아 보이고 잘 작동합니다.
저에게 효과적인 간단한 솔루션입니다. $@.
Test(){
set -x
grep "$@" /etc/hosts
set +x
}
Test -i "3 rb"
+ grep -i '3 rb' /etc/hosts
(set -x 덕분에) 실제 grep 명령어를 확인할 수 있었습니다.
초기 텍스트가 문자열 유형 변수로 설정된 경우 다음과 같이 이 문제를 확장할 수 있습니다.
function status(){
if [ $1 != "stopped" ]; then
artist="ABC";
track="CDE";
album="DEF";
status_message="The current track is $track at $album by $artist";
echo $status_message;
read_status $1 "$status_message";
fi
}
function read_status(){
if [ $1 != "playing" ]; then
echo $2
fi
}
이 경우 status_message 변수를 문자열로 전달하지 않으면(""로 둘러싸임) 다른 인수로 분할됩니다.
"$1800":현재 트랙은 ABC에 의해 DEF에서 CDE입니다.
$198:그
저도 같은 종류의 문제가 있었고 사실 문제는 함수나 함수 호출이 아니라 함수에 대한 인수로 전달한 것이었습니다.
함수는 스크립트의 본문 - '메인'에서 호출되었으므로 명령줄에서 "st1 a" "st2 cd" "st3 ef"를 전달하고 내 함수 $*를 사용하여 함수로 전달했습니다.
$*는 공백을 구분 기호로 사용하여 함수 호출에서 해석될 문자 집합으로 확장될 때 문제를 발생시킵니다.
해결책은 명시적 인수 처리에서 호출을 '메인'에서 함수 쪽으로 변경하는 것이었습니다. 그러면 호출은 내 함수 "$1" "$2" "$3"이 되고 따옴표가 인수를 구분할 때 문자열 내부의 공백을 보존합니다.따라서 매개 변수에 공백이 포함될 수 있는 경우 모든 함수 호출을 통해 매개 변수를 명시적으로 처리해야 합니다.
이것이 문제를 장시간 검색하는 이유일 수 있으므로 인수를 전달하는 데 $*를 사용하지 않는 것이 현명할 수 있습니다.
언급URL : https://stackoverflow.com/questions/1983048/passing-a-string-with-spaces-as-a-function-argument-in-bash
'programing' 카테고리의 다른 글
| WCF 콜백을 사용하려면 어떤 단계를 거쳐야 합니까? (0) | 2023.05.08 |
|---|---|
| .NET 그래프 라이브러리 주변에 있습니까? (0) | 2023.05.08 |
| Azure PowerShell 버전을 찾으려면 어떻게 해야 합니까? (0) | 2023.05.08 |
| PowerShell에서 콘텐츠가 있는 디렉터리를 조용히 제거하는 방법 (0) | 2023.05.08 |
| 일부 셀에 하이퍼링크 추가openpyxl (0) | 2023.05.08 |