/ bin / dash: плохая замена - PullRequest
       37

/ bin / dash: плохая замена

0 голосов
/ 08 декабря 2018

Мне нужно выполнить манипулирование строкой в ​​сценарии оболочки (/bin/dash):

#!/bin/sh

PORT="-p7777"
echo $PORT
echo ${PORT/p/P}

последний эхо не выполняется с Bad substitution.Когда я меняю оболочку на bash, она работает:

#!/bin/bash

PORT="-p7777"
echo $PORT
echo ${PORT/p/P}

Как я могу реализовать подстановку строк в dash?

Ответы [ 2 ]

0 голосов
/ 08 декабря 2018

Использование расширения параметра:

$ cat foo.sh
#!/bin/sh

PORT="-p7777"
echo $PORT
echo ${PORT:+-P${PORT#-p}}

PORT=""
echo $PORT
echo ${PORT:+-P${PORT#-p}}

Запустить его:

$ /bin/sh foo.sh
-p7777
-P7777

Обновить :

$ man dash:
- - 
${parameter#word}     Remove Smallest Prefix Pattern.

$ echo ${PORT#-p}
7777

$ man dash
- - 
${parameter:+word}    Use Alternative Value.

$ echo ${PORT:+-P${PORT#-p}}
-P7777
0 голосов
/ 08 декабря 2018

Подстановка, которую вы используете, не является базовой функцией POSIX (см. здесь , в разделе 2.6.2 Расширение параметров), и dash не реализует ее.

Но вы можете сделать это с любым из ряда внешних помощников;Вот пример использования sed:

PORT="-p7777"
CAPITOLPORT=$(printf '%s\n' "$PORT" | sed 's/p/P/')
printf '%s\n' "$CAPITOLPORT"

Кстати, обратите внимание, что я использую printf '%s\n' вместо echo - это потому, что некоторые реализации echo делают непредсказуемые вещи, когда их первый аргументначинается с "-".printf немного сложнее в использовании (вам нужна строка формата, в данном случае %s\n), но гораздо надежнее.Я также заключаю в двойные кавычки все ссылки на переменные ("$PORT" вместо просто $PORT), чтобы предотвратить непредвиденный синтаксический анализ.

Я бы также рекомендовал переключаться на переменные в нижнем или смешанном регистре.Существует большое количество переменных all-caps, которые имеют специальные значения, и если вы случайно используете одно из них, это может вызвать проблемы.

...