Странное поведение bash, когда для цикла for задана IFS

Я использую Debian и столкнулся с похожей проблемой, во-первых, я не буду рекомендовать скрипт, потому что он не работает на экране блокировки.

если вы используете gnome, установите настройки gnome -и у него есть опция.

В качестве альтернативы отредактируйте файл /etc/systemd/logind.conf, просто раскомментировав строку HandleLidSwitch=suspend.

это сработало для меня.

2
16.03.2021, 13:40
2 ответа

для

Согласно требованиям POSIX , некоторые слова (, включая for), должны быть либо:

  1. Первое слово команды
  2. Первое слово, следующее за одним из зарезервированных слов, кроме case, for или in
  3. Третье слово в case-команде (допустимо только в этом случае)
  4. Третье слово в команде for (допустимо только в и do в этом случае)

Это не тот случай. Вот почему forне понимается оболочкой и сообщает об ошибке.

Этот вопрос (о временной IFS )очень похож на Когда можно использовать временную IFS для разделения полей? . Но этот ответ охватывает только простые команды (Это составная команда ).

Дополнительно:

ИФС

Значение IFS влияет только на расширения(расширения переменной ).

Значение IFS должно быть установлено в предыдущей команде, прежде чем оно подействует.:

$ a="one:two:three"
$ echo $a
one:two:three

$ (
> IFS=":"
> echo $a
> )
one two three

$ ( IFS=":"; echo $a )
one two three

Но НЕ:

$ ( IFS=":" echo $a )
one:two:three

Для этого нужно отложить выполнение команды:

$ ( IFS=":" eval echo '$a' )
one two three

Итак, для вашего скрипта вам нужно будет сделать что-то вроде:

b="720:500:560:130"
( IFS=":";
  for      a in $b   ;
  do       echo "$a" ;
  done
)

Обратите внимание, что, поскольку $bраскрывается без кавычек, любой символ подстановки (*,[, ? и другие с набором extglob )также будут расширены. Возможно, создание списка файлов вместо одного.

0
18.03.2021, 22:25

Вместо того, чтобы бороться с магией IFS, используйте функции «пути» Стивена Кольера. Они допускают новый тип данных вbash:списке, разделенном двоеточием -. addpath, delpath, listpathи т. д. Я использую эти функции на своих PATH, MANPATH, чтобы разрешить locateпоиск офлайн-медиа и вообще bashзадачи.

Вот как, из моего ответа AskUbuntu:

Я использую функции bash _path _Стивена Коллиера, описанные в Linux Journal еще в 2000 году:

https://www.linuxjournal.com/article/3645https://www.linuxjournal.com/article/3768https://www.linuxjournal.com/article/3935

Функция addpathдобавляет запись в путь, только если ее там нет изначально. delpath -nудаляет из пути все несуществующие -каталоги.

Вы можете получить файл pathfunc.tgzизhttps://web.archive.org/web/20061210054813/http://www.netspinner.co.uk:80/Downloads/pathfunc.tgz

-1
18.03.2021, 22:25

Теги

Похожие вопросы