2015-12-30 6 views
1

Я хотел бы применить parameter expansion (например, поиск и замена), чтобы удалить пробелы из brace expansion ({a..z}). Возможно?Как применить расширение параметра при расширении скобки (диапазон)?

Итак, у меня есть следующий диапазон: {a..z}, который состоит из всех букв, и я хотел бы удалить пробелы за один раз.

Вот уже пример:

$ echo {a..z} 
a b c d e f g h i j k l m n o p q r s t u v w x y z 
$ az=$(eval echo {a..z}) 
$ echo $az 
a b c d e f g h i j k l m n o p q r s t u v w x y z 
$ echo ${az// /} 
abcdefghijklmnopqrstuvwxyz 

Можно ли применить разложение параметра непосредственно на диапазоне? Или, по крайней мере, сделать это в одном выражении, особенно, не присваивая это переменной?


Одним из примеров использования является определение всех параметров динамически для getopts, например:

while getopts {a..z} arg; do 
    printf $arg 
done 

однако это не работает (например ./az.sh -a -b -c) в качестве пространств от этого диапазона должен быть удален первым.

ответ

3

Используйте этот код вместо:

$ printf '%s' {a..z}; echo 
abcdefghijklmnopqrstuvwxyz 

И это, если вам нужно использовать вар (Баш):

расширение параметров
$ printf -v var '%s' {a..z} 
$ echo "$var" 
abcdefghijklmnopqrstuvwxyz 

только может быть применен к параметру (следовательно, его имя).
Итак, нет, вы не можете применить «Расширение параметров» к «Расширению брекета».
Она должна быть в два этапа:

var="$(printf '%s ' {a..z})" 
var="${var// /}" 

Так getopts пример будет выглядеть следующим образом:

while getopts "$(printf '%s' {a..z})" arg; do 
    printf '%s' "$arg" 
done 
0
$ set {m..z} && IFS=, && echo "$*" 
m,n,o,p,q,r,s,t,u,v,w,x,y,z 
$ set {m..z} && IFS='' && echo "$*" 
mnopqrstuvwxyz 
+0

Session-глобальная модификация 'IFS' для локального эффекта. –

+0

Также перезаписывайте текущие позиционные параметры, не сохраняя их. – chepner

+0

'(declare -a f = ({a..z}); IFS =; echo" $ {f [*]} ")'. Но решение printf лучше. – rici

 Смежные вопросы

  • Нет связанных вопросов^_^