Основная проблема в вашем скрипте заключается в том, что i
принимает в качестве значений фактические имена файлов, а j
— это просто число. Взятие имен в массив и использование i
и j
в качестве индексов должно работать:
files=(*)
count=${#files[@]}
for (( i=0 ; i < count ;i++ )); do
for (( j=i+1 ; j < count ; j++ )); do
if diff -q "${files[i]}" "${files[j]}" >/dev/null ; then
echo "${files[i]} and ${files[j]} are the same"
fi
done
done
(Кажется, работает с Bash и ksh
/ksh93
Debian имеет.)
Назначение a=(this that)
инициализирует массив a
двумя элементами this
и то
(с индексами 0 и 1). Разделение слов и подстановка работают как обычно, поэтому files=(*)
инициализирует files
именами всех файлов в текущем каталоге (кроме dotfiles). "${files[@]}"
расширится до всех элементов массива, а знак решетки запрашивает длину, поэтому ${#files[@]}
— это количество элементов в массиве. (Обратите внимание, что ${files}
будет первым элементом массива, а ${#files}
— это длина первого элемента, а не массива!)
for i in `/folder/*`
Обратные кавычки здесь наверняка опечатка? Вы бы запустили первый файл как команду, а остальные предоставили бы ей в качестве аргументов.
GNU awk может обрабатывать поля как последовательности экранированных символов или не -двоеточия -или -символов обратной косой черты (см. этот ответ ), поэтому следующее должно работать. Не очень эффективное, но хотя бы решение...
#!/bin/bash
line="WiFi:00\:0A\:97\:6F\:7B\:AC:165:5660 MHz:15:"
# line=`nmcli -f SSID,BSSID,CHAN,FREQ,SIGNAL,SECURITY -t dev wifi`
for i in 1 2 3 4 5; do
echo $line | gawk -v FPAT='(\\\\.|[^\\\\:])*' '{print $'$i'}'
done
Perl позволяет создавать разделитель полей с просмотром назад -, а также удобно предоставляет модуль JSON . Таким образом, вы можете сделать что-то вроде
nmcli -f SSID,BSSID,CHAN,FREQ,SIGNAL,SECURITY -t dev wifi |
perl -F'(?<!\\):' -MJSON=encode_json -lne 'print encode_json([map { s/\\:/:/g ; $_ } @F])'
Тестирование на вашем примере nmcli
вывод:
printf 'WiFi:00\:0A\:97\:6F\:7B\:AC:165:5660 MHz:15:' |
perl -F'(?<!\\):' -MJSON=encode_json -lne 'print encode_json([map { s/\\:/:/g ; $_ } @F])'
["WiFi","00:0A:97:6F:7B:AC","165","5660 MHz","15"]
Использование sed
для очистки данных иmlr
для преобразования их в JSON:
h='SSID,BSSID,CHAN,FREQ,SIGNAL,SECURITY'
nmcli -f $h -t dev wifi |
sed 's/^:/"",/;s/\([^\]\):/\1,/g;s/[\]:/:/g' |
mlr --c2j --jvstack --jlistwrap label $h
Пример вывода:
{
"SSID": "FooBarBaz",
"BSSID": "13:F6:8C:56:9B:3B",
"CHAN": 36,
"FREQ": "5180 MHz",
"SIGNAL": 20,
"SECURITY": "WPA1 WPA2"
},
Несколько заметок здесь:
nmcli
из поля с помощью--escape/-e no
SSID
и Security
не всегда возвращаются, поэтому я добавил заполнитель(--
)
printf '%s' "$(nmcli -f SSID,BSSID,CHAN,FREQ,SIGNAL,SECURITY -e no -t dev wifi)" |
jq -sR 'split("\n") |
map(split(":") |
{SSID: (if.[0] == "" then "--" else.[0] end),
BSSID:.[1:6] | join(":"),
CHAN:.[7],
FREQ:.[8],
SIGNAL:.[9],
SECURITY: (if.[10] == "" then "--" else.[10] end)})'