Объединение двух строк для формирования команды оболочки приводит к странному поведению - PullRequest
0 голосов
/ 03 апреля 2020

У меня есть этот код:

#!/bin/ksh

value=''
builddir=`dirname $0`
cd $builddir
while read line 
do
    echo line: $line
    param=`echo $line|cut -d '=' -f1`
    if [[ $param = 'profile.home' ]] 
    then
        value=`echo $line|cut -d '=' -f2`
        echo was_profile:$value
        break
    fi
done < was-config.properties
if [[ $value = '' ]]
then
    echo "Please configure the profile.home dir into the was.config.properties file and run again the script"
else
  "$value"/bin/ws_ant.sh -buildfile $builddir/build.xml $@

fi

Что возвращает:

line: #was configuration properties
line: 
line: was.home=/opt/IBM/WebSphere/AppServer/
line: profile.home=/opt/IBM/WebSphere/AppServer/profiles/AppSrv01
was_profile:/opt/IBM/WebSphere/AppServer/profiles/AppSrv01
/bin/ws_ant.sh: not foundBM/WebSphere/AppServer/profiles/AppSrv01

Почему я получаю не найден? Кажется, конкатенация "$value"/bin/ws_ant.sh не работает !!!

1 Ответ

0 голосов
/ 06 апреля 2020

В вашем файле есть возврат каретки (0A или ^M или \r), см. Как преобразовать DOS / Windows символ новой строки (CRLF) в Unix символ новой строки (LF) в Bash script? .
В вашем случае вам не нужно l oop через файл конфигурации. Вы можете использовать

value=$(grep profile.home= was-config.properties | cut -d= -f2 | tr -d '\r')

или

value=$(sed -rn 's/^profile.home=([^\r]*)*/\1/p' was-config.properties)

или

value=$(awk -F "\r|=" '/^profile.home/ {print $2}' was-config.properties)
...