Если у меня есть эти данные в моем сценарии оболочки:
DIR=/opt/app/classes JARS=a.jar:b.jar:c.jar
Как я могу объединить это в строку
/opt/app/classes/a.jar:/opt/app/classes/b.jar:/opt/app/classes/c.jar
в сценариях Shell / Bash?
Вот очень короткий:
$ echo "$DIR/${JARS//:/:$DIR/}" /opt/app/classes/a.jar:/opt/app/classes/b.jar:/opt/app/classes/c.jar
Pure Optimized Bash 1-лайнер
IFS=:; set -- $JARS; for jar; do path+=$DIR/${jar}:; done; echo "$path"
/opt/app/classes/a.jar:/opt/app/classes/b.jar:/opt/app/classes/c.jar:
Используйте перевод и переберите результаты. Затем обрежьте символ результата «:» в начале строки.
#! /bin/bash DIR=/opt/app/classes JARS=a.jar:b.jar:c.jar for i in $(echo $JARS | tr ":" "\n") do result=$result:$DIR/$i done echo ${result#:} // Remove the starting :
Результат:
Pure Bash, без внешних утилит:
saveIFS=$IFS IFS=: jararr=($JARS) echo "${jararr[*]/#/$DIR/}" IFS=saveIFS
Оригинальный ответ (до изменения вопроса):
IFS=: read -ra jararr <<<"$JARS" newarr=(${jararr[@]/#/$DIR/}) echo "${newarr[0]}:${newarr[1]}"
Если вы не возражаете против дополнительной точки с запятой в конце:
[~]> for a in `echo $JARS | tr ":" "\n"`;do echo -n $DIR/$a:;done&&echo /opt/app/classes/a.jar:/opt/app/classes/b.jar:/opt/app/classes/c.jar: