밑줄이있는 파일 이름을 만들려면 두 개의 변수를 연결해야합니다. 내 변수 $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$()_$HHMMSS
YYYYMMDD_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
\r
Windows 파일에서 읽을 경우 후행 캐리지 리턴을 읽습니다 .
간단한 해결책 (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에 제어 문자가 포함되어 있어도 올바른 값을 얻습니다 .
답변
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"