Ваш перший фрагмент - це не що інше, як синтаксис оболонки. Це правильний синтаксис Perl.
Ваш другий фрагмент не використовується cutправильно; Я не знаю, що ти мав намір.
Оболонка має вбудовану структуру поділу рядків: коли ви пишете $somevarбез жодних лапок, спочатку оболонка шукає значення змінної somevar, потім розбиває це значення на окремі слова на вказані символи IFSта, нарешті, інтерпретує кожне слово як глобус візерунок (файл підстановки). Таким чином, ви можете розділити рядок, встановивши IFSсимвол роздільника і тимчасово відключивши глобус.
set -f; IFS=,
arr=($stats)
set +f; unset IFS
Зауважте, що якщо поле містить пробіл, елемент масиву збереже цей пробіл. Якщо ви хочете розділити на весь пробіл, а також коми, встановіть IFS=', '. Зауважте, що IFSце не рядок для розділення на, а набір символів, який потрібно розділити на; або пробіл, або кома становлять роздільник. Крім того, існують спеціальні правила для простору пробілів: будь-яка послідовність нульових або більше пробілів, що супроводжується комою, за якою нуль або більше пробілів, становитиме один роздільник, а будь-яка послідовність одного або декількох пробілів також становитиме роздільник.
Якщо ви хочете лише позбавити пробілів на початку або в кінці поля, вам доведеться робити це за елементами.
shopt -s extglob
for ((i=0; i<${#arr[@]}; i++)); do
arr[i]=${arr[i]#+( )} # strip one or more spaces at the beginning
arr[i]=${arr[i]%+( )} # strip one or more spaces at the end
done
awk '{ split("3,aac-lc, 93.8, aaclc, 77.3, h.264, 1024.6, h.264, 1029.1, 31, 31, 0,0,0.000000,31,31,0,0,0.000000,7,0,0,0.000000,30,1280 720,10,0,0,0.000000,30,1280 720 ",arr,","); print arr[1]; }'АБОecho "3,aac-lc, 93.8, aaclc, 77.3, h.264, 1024.6, h.264, 1029.1, 31, 31, 0,0,0.000000,31,31,0,0,0.000000,7,0,0,0.000000,30,1280 720,10,0,0,0.000000,30,1280 720" | awk '{ split($0,arr,","); print arr[1]; }'Це повинно працювати.