밑줄로 두 변수 연결


53

밑줄이있는 파일 이름을 만들려면 두 개의 변수를 연결해야합니다. 내 변수 $FILENAME$EXTENSION파일에서 파일 이름을 읽는 위치를 호출 할 수 있습니다.

FILENAME=Hello
EXTENSION=WORLD.txt

지금...

나는 성공하지 않고 다음을 시도했다.

NAME=${FILENAME}_$EXTENSION
NAME=${FILENAME}'_'$EXTENSION
NAME=$FILENAME\\_$EXTENSION

나는 항상 어떤 종류의 이상한 출력을 얻습니다. 일반적으로 밑줄이 먼저입니다.

나는 그것이 필요하다

echo $NAME
Hello_WORLD.txt

2
스크립트에 캐리지 리턴 문자가 포함되어있을 수 있습니다.
Stéphane Chazelas

그렇습니다. : D
Rhyuk

답변:


65

다음과 같은 것을 사용할 수 있습니다.

NAME=$(echo ${FILENAME}_${EXTENSION})

이것은 또한 작동합니다 :

NAME=${FILENAME}_${EXTENSION}

1
문제는 내가 NAME을 읽는 파일이었습니다. Windows 형식 ... 솔루션은 그 후에 훌륭하게 작동했습니다. 감사합니다
Rhyuk

2
첫 번째 명령은 변수의 값과 명령 대체를 사용하며 echo도움을 줄 수 없습니다. 두 번째 명령은 이미 질문에 주어졌습니다.
Gilles

1
예! 나는 그것을 좋아한다. 이것은 가장 오랫동안 나를 성가 시게했다. 솔루션 주셔서 감사합니다!
racl101

이것은 나를 위해 작동합니다. '$ FILENAME_ $ EXTENSION'을 사용하면 '$ EXTENSION'값만 나타납니다. 왜 이런 일이 발생했는지 설명해 주시겠습니까? 감사합니다
Lei Hao

12

너의:

NAME=${FILENAME}_$EXTENSION
NAME=${FILENAME}'_'$EXTENSION

모두 괜찮습니다.

NAME=${FILENAME}_${EXTENSION}
NAME=$FILENAME'_'$EXTENSION
NAME=$FILENAME\_$EXTENSION
NAME=$FILENAME"_$EXTENSION"

(그러나 확실 하지 NAME=$(echo ${FILENAME}_${EXTENSION}) 으로서 그것을 사용echo 하고 연산자 ).split+glob

NAME=$FILENAME_$EXTENSION

다음과 동일했을 것입니다 :

NAME=${FILENAME_}${EXTENSION}

as _( \또는 반대 ')는 변수 이름에 유효한 문자입니다.

문제는 LF 대신 CRLF로 구분 된 행을 가지고 있다는 것입니다. 즉, 변수 내용이 CR 문자로 끝났습니다.

CR 문자는 터미널에 기록 될 때 터미널이 커서를 행의 시작 부분으로 이동하도록 지시합니다. 따라서 Hello<CR>_WORLD.TXT<CR>터미널로 전송되면 _WORLD.TXT(을 재정의 함 Hello) 으로 표시됩니다 .


1

${FILENAME}_${EXTENSION}위에서 언급 한 구문 을 사용하도록 전환했습니다 .

$()두 변수를 밑줄로 연결해야 할 때 사용했습니다 . 예를 들어, $YYYYMMDD$()_$HHMMSSYYYYMMDD_HHMMSS 형식의 타임 스탬프가 포함 된 파일 이름을 생성합니다. 가운데 $()는 아무것도 반환하지 않고 두 변수를 분리합니다.

방법과 위 time$YYYYMMDD$()_$HHMMSS방법 중 일부를 사용하여 할당을 측정하는 데 사용 했으며이를 사용 하는 이전 서버에서 모두 0ms를보고했습니다. 성능은 문제가되지 않는 것 같습니다.


그것은 질문에 대답하지 않습니다. 이에 대한 새로운 질문을 제기해야합니다. $()몇몇 쉘에서 서브 쉘을 포크합니다 (일부 최적화). 또한 의도하지 않은 것을 위해 운영자를 납치하고 있습니다. ${x}_y당신이 원하는 것입니다.
Stéphane Chazelas

"그 질문에 대답하지 않습니다"는 무슨 뜻입니까? 큰 대답은 아니지만 대답입니다.
Scott

모호성을 제거하도록 편집되었습니다.
user208145

0

변수를 소문자로 사용해야합니다 (가장 좋습니다).
FILENAME과 EXTENSION 대신 파일 이름과 확장자를 사용하겠습니다.

"파일 이름을 파일에서 읽습니다"라고 말하면 스크립트는 다음과 같다고 가정합니다.

read -r filename  <file.txt
extension=World.txt

그리고 변수 $ filename과 $ extension을 밑줄로 연결하려고합니다 _.
제공하는 예제 (더블 \ 없음 제외)는 다음과 같이 올바르게 작동합니다.

name=${filename}_$extension
name=${filename}'_'$extension
name=$filename\_$extension

다른 사람으로서 :

name="${filename}"'_'"${extension}"
name="$filename"'_'"$extension"
name="${filename}_${extension}"

따라서 문제는 변수가 어떻게 붙어 있는지가 아니라 var의 내용과 관련이 있습니다. 이것을 생각하는 것이 합리적입니다.

read -r filename  <file.txt

\rWindows 파일에서 읽을 경우 후행 캐리지 리턴을 읽습니다 .

간단한 해결책 (ksh, bash, zsh)은 읽기 변수에서 모든 제어 문자를 제거하는 것입니다.

filename=${filename//[[:cntrl:]]/}

이것은 캐리지 리턴이있는 값으로 시뮬레이션 할 수 있습니다.

$ filename=$'Hello\r'
$ echo "starting<$filename>end"
>endting<Hello                       ### note the return to the start of line.
$ echo "starting<${filename//[[:cntrl:]]/}>end"
starting<Hello>end

또는 다음 값을 대체하십시오 filename.

$ filename="${filename//[[:cntrl:]]/}"
$ echo "start<$filename>end"
start<Hello>end

결론.

그래서 이건:

name="${filename//[[:cntrl:]]/}_${extension//[[:cntrl:]]/}"

name다른 var에 제어 문자가 포함되어 있어도 올바른 값을 얻습니다 .



-2

이것을 사용할 수도 있습니다 : 별도의 var를 공백으로 분리하고 tr을 사용하여 공백을 제거하여 연결하십시오.

TableNameToCreate="MyTable"
# concatenation work is done here 
$(echo "$TableNameToCreate _my_other_Info " | tr -d " ")

#Proof
echo "Var to create with var pasted as prefix to suffix
    $(echo "$TableNameToCreate _my_other_Info " | tr -d " ") 
. "

# create a new var
NewVar=$(echo "$TableNameToCreate _my_other_Info " | tr -d " ")

#proof
echo "$NewVar"

(1)이 질문은 이미 적절하게 답변되었습니다. (2) 기존 변수에 특수 문자가 있으면 대답은 무엇입니까?
G-Man

캐리지 리턴이 포함 된 변수의 문제는 해결하지 못합니다. 또한 원하지 않는 공간을 제거합니다.
Kusalananda

@ Kusalananda : 사실, 내가 뭔가를 간과하지 않는 한, 이것은 캐리지 리턴을 잘 처리합니다. 공백이 유일한 문제입니다.
G-Man
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.