Конкатенация строк в UNIX/скрипте оболочки

Приведенный ниже код работает нормально до конкатенации (второй последний шаг) - мне нужно объединить Hello с «physId», например. - Имя файла UM123456789.20150503 - я извлекаю M123456789, и мне нужно добавить к нему "HELO" в конце. Но согласно приведенному ниже сценарию - когда я использую конкатенацию, она перезаписывает M123456789, и поэтому вывод становится HELO456789. Я пытаюсь получить результат в виде M123456789HELO. Где я ошибаюсь?

#!bin/sh  
absolutePath=/abc/data/abc_unix/stg/decrypt/*.*  
filepath=$(echo ${absolutePath%.*})  
echo "$filepath"  
filenameext=$(echo ${filepath#/abc*decrypt/})  
echo "$filenameext"  
file=$(echo ${filenameext#.*})  
echo "$file"  
extract_physId=$(echo ${file:1:9})  
physId=$(echo ${extract_physId})  
echo "$physId"  
key="$physId"HELO  
echo "$key"  

person bleedblue    schedule 03.05.2015    source источник


Ответы (2)


HELO перезаписывает начало строки, так как строка заканчивается возвратом каретки. Запустите dos2unix для входных файлов или sed 's/\r$//'


Кстати, у вас там много ненужных echo. Я бы предложил переписать:

#!bin/sh  
for file in /abc/data/abc_unix/stg/decrypt/*.*; do
    filename=$(basename "$file")   # remove the directory
    filename=${filename%.*}        # remove the extension
    physId=${filename#?}           # remove the first char
    key="${physId}HELO"
    echo "$key"
done
person glenn jackman    schedule 03.05.2015
comment
как именно я должен использовать - sed 's/\r$//' ? - какая линия? - person bleedblue; 03.05.2015
comment
нужна помощь в этом, пожалуйста - person bleedblue; 03.05.2015
comment
Попробуйте sed -i 's/\r$//' script.sh, затем запустите его снова. - person glenn jackman; 03.05.2015
comment
Огромное спасибо !! оно работает!! - но похоже, что я должен запускать его каждый раз, когда я запускаю скрипт? - могу ли я включить это в скрипт и просто вызвать скрипт? - person bleedblue; 03.05.2015
comment
Нет, достаточно одного раза. Вы редактировали этот скрипт в Windows и переносили его в unix? - person glenn jackman; 03.05.2015
comment
нет! - я делаю все на сервере UNIX - я просто закрыл терминал - и снова запустил скрипт - на самом деле это не сработало! - дает тот же старый вывод - HELO456789 - person bleedblue; 03.05.2015
comment
запустите свой скрипт и направьте вывод через od -c — вы увидите символ \r. Попытайтесь понять, как это происходит. - person glenn jackman; 03.05.2015

Либо измените #!/bin/sh на #!/bin/bash, либо:

сдача

extract_physId=$(echo ${file:1:9}) 

to

extract_physId=$( echo "${file}" | cut -c1-10)

sh не распознает ${file:1:9}

person Jahid    schedule 03.05.2015
comment
это работает в .sh - расскажите о конкатенации, если можете! - person bleedblue; 03.05.2015
comment
В конкатенации нет ничего плохого. Запустите этот фрагмент кода, чтобы проверить: #!/bin/sh string="Hello" concat="$string"World echo $concat - person Jahid; 03.05.2015
comment
Вы заметили, что написали с ошибкой #!bin/sh. это #!/bin/sh - person Jahid; 03.05.2015
comment
/bin/sh может быть или не быть той же оболочкой, что и /bin/bash. Если вы используете функции, специфичные для bash, и если вы заботитесь о переносимости вашего скрипта на системы, где /bin/sh может быть какой-то оболочкой, отличной от Bash, вам следует использовать #!/bin/bash. - person Keith Thompson; 04.05.2015