выводится ошибка - [: missing `]'
Что значит эта ошибка
if [ "$projectDir" == "video" && "$flag" != "noflag" ]; then
следующим образом: ключевое слово if
, команда [
с аргументами "$projectDir" == "video"
, оператор &&
, команда "$flag"
с аргументами != "noflag" ]
, разделитель ;
, оператор then
.[
(она же test
), очевидно, не нашла в своих аргументах закрывающей скобки ]
, которая должна там быть при таком её вызове.как ее можно исправить?
-a
вместо &&
, как говорит man test. Если записать вывод данных в файл
# /opt/speedtest/speedtest | tee spdt.log
то в файле не видно промежуточных значений значений.
strace -f -e ioctl,write -o log <program command line>
myvar=$(find "/tmp/folders" -iname "App *" -type d -maxdepth 1) count=${#myvar[@]} echo $count
И в ответ получаю число 120, которое означает количество символов, а не строк
2. Почему в моем примере выводится количество символов в переменной, а не количество строк?
${#myvar[@]}
-- это длина массива. Если идея была создать в первой строке массив из имён файлов, то там не хватает пары скобок:myvar=( $(find "/tmp/folders" -iname "App *" -type d -maxdepth 1) )
${#myvar[@]}
выведет длину этого массива, т.е. количество строк в нём. 1. Реально ли подсчитать количество строк в файле или переменной с помощью глобов, как показано тут - https://stackoverflow.com/a/32727260 ?
wc -l
. Если права на файл не go-rwx
go-rwx
, эта запись означает "отнять rwx у g и o". Разрешения могут быть u=rw,go=
. Получить их можно например так: stat -c %A /etc/shadow
, а проверить условие -- командой test, например: if [ `stat -c %A /etc/shadow` != "-rw-------" ]
, или командой grep, например: if ! stat -c %A /etc/shadow | grep -q '^....------$'
.chmod go-rwx /etc/shadow
. Как я могу данные из них подставить в echo, сохранив при этом функционал запроса?
eval "echo {$A1}.{$A2}.{$A3}"
eval
применяет функциональность shell к произвольной строке. как перенаправить информацию из вывода команд в файл, который создается в процессе проверки командой
#touch $( date '+%Y-%m-%d_%H-%M' )
…
file=$( date '+%Y-%m-%d_%H-%M' )
touch "$file"
…
echo -e " Product Name : $PN_FRU" >> "$file"
…
Есть ли способ из самого скрипта подменить сам скрипт чтобы он не портился?
cp
или mv
заменяет открытый интерпретатором файл, исходный файл не портится. Если интерпретатор взаимодействует с файлом через один и тот же файловый дескриптор, то никакого значения замена файла не имеет. Нужно разбираться с деталями того что портится, чтобы понять, как это пофиксить. Написали многоуровневое меню при помощи функций, работает без проблем все, кроме выхода.
Примерно на 2-3 уровне меню "Exit" не выходит из скрипта, а возвращается на уровень выше.
clear; ./1_1_ipmi_menu.sh ; unem ;;
exit
внутри скрипта 1_1_ipmi_menu.sh
приведёт в возврату в unem
, вы же тут отдельный процесс создаёте.exit
в функциях приводил к выходу из приложения нужно импортировать (source
) функции из этих скриптов и вызывать функции вместо запуска скриптов.#!/bin/bash
unem() {
read b
case $b in
1) clear ; … ; unem ;;
2) clear; PMI ; unem ;;
3) clear ; menu ;;
0) exit 0 ;;
esac
}
source 1_1_ipmi_menu.sh
source 1_1_system_menu.sh
unem
С чего начинать разбираться?
дамп postgres, после чего, если комманда с дампом выполнилась…
pg_dump -U postgres zkgu | gzip > /mnt/NStore/1c-sqldump/$n$d.gz EXIT_STATUS=$? if [[$EXIT_STATUS -eq "0"]]
if pg_dump -U postgres zkgu | gzip > /mnt/NStore/1c-sqldump/$n$d.gz
$?
-- это статус завершения последней команды, а у вас там пайплайн и последняя команда -- gzip
. Статус завершения именно pg_dump
не проверяется, ни первым вариантом, ни вторым. --to-command
-- это прикольно.tar -xzvOf archive.tar.gz | tar -xzvO | tar -xzvO | … | tar -xzvO | tar -xzv
как все-таки правильно сверить, должно быть 100 процентное совпадение с эталонным файлом в результате команды должна быть 1.
./test.sh | if cmp -s - test ; then echo 1 ; else echo 0 ; fi
result=$(./test.sh)| cmp -s $result test
test.sh
с содержимым файла test, но здесь не нужен конвейер и cmp
так не работает.cmp -s (./test.sh) test
cmp -s <( ./test.sh ) test
. Но из-за того, что конструкция <(…)
специфична для bash этот вариант на мой взгляд менее предпочтителен чем вариант ./test.sh | if cmp -s - test
. sed -e '/\n\/\s/g'
Но почему ентер не меняется на пробел.
g
в конце имелось в виду 's/\n/ /g'
?\n
и следующую строку к уже прочитанной: speedtest --simple | sed '1d;N;s/\n/ /g'