В настоящее время вы храните набор имен, а затем трубопроводы до sed
. Когда Глоб расширяется это становится команда на форме:
1butene.com xxxx | sed 's/.com//g'
что, очевидно, не то, что разрешено, а 1butene.com
это не команда сама по себе.
То, что вы должны сделать, это
1) хранить данные,
2) выполнить очистку.
Для этого у нас есть хорошие новости! Вы можете выполнить Shell parameter expansion on arrays!
Таким образом, вы можете хранить данные в массиве:
names=(*.com)
А затем выполнить замену во всех из них, просто extracting its name без расширения:
printf "%s\n" "${names[@]%.*}"
Если после этого вы хотите в change values of bash array elements without loop, просто использовать синтаксис
new_array=("${names[@]%.*}")
Пример:
$ touch a{1..3}.{sql,com}
$ com_names=(*com)
$ printf "%s\n" "${com_names[@]}"
a1.com
a2.com
a3.com
$ printf "%s\n" "${com_names[@]%.*}"
a1
a2
a3
b=("${com_names[@]%.*}") # assign to a new array
$ printf "%s\n" "${b[@]}"
a1
a2
a3
Хорошо, что, кажется, работает как-то. Но как сохранить эти имена в массиве? Если я выполняю test = (\ *. Com), а затем test = $ {"% \ n" "$ {names [@]%. \ *}"} $ Test пусто – user7408924
@ user7408924 см. Последнюю часть моего объяснения , перед разделом _Sample_: 'var = (" $ {... [@]%. *} ")'. Кроме того, постарайтесь не использовать имя 'test' для переменных, так как это сама команда! – fedorqui
Не смотрите на свое последнее редактирование. Работает! Спасибо! – user7408924