밑줄로 두 변수 연결 $EXTENSION파일에서 파일 이름을 읽는 위치를 호출 할

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

FILENAME=Hello
EXTENSION=WORLD.txt

지금…

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

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

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

나는 그것이 필요하다

echo $NAME
Hello_WORLD.txt



답변

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

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

이것은 또한 작동합니다 :

NAME=${FILENAME}_${EXTENSION}


답변

너의:

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) 으로 표시됩니다 .


답변

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

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

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


답변

변수를 소문자로 사용해야합니다 (가장 좋습니다).
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에 제어 문자가 포함되어 있어도 올바른 값을 얻습니다 .


답변

스테판 Chazelas의 답변 ,

NAME=${FILENAME}_$EXTENSION

물론 가장 좋은 대답이며 받아 들여지는 대답이어야합니다. 그러나 user208145의 답변 의 정신 에서 대안은 다음과 같습니다.

UNDERSCORE='_'
NAME=$FILENAME$UNDERSCORE$EXTENSION


답변

이것을 사용할 수도 있습니다 : 별도의 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"


답변