bash: !": event not found
$ echo "hi\!" hi\!
echo 'Hello World!'
histexpand. Это можно сделать командой set +H или set +o histexpand:set +H echo "Hello World!"
mp3info -t "Don't Let It Show" ... mp3info -t "Ah! Leah!" ...
set +H в свой .bashrc. Но это вопрос привычки и каждый решает для себя сам.$* и $@ не совсем то, что вам нужно: после подстановки параметров они становятся списком слов, переданных в аргументах, а не списком параметров по отдельности.for arg in "$@"
for arg
for arg соответствует for arg in "$@". Заключенная в двойные кавычки переменная "$@" — это специальная "$@" преобразуется в список "$1" "$2" "$3" и т.д. Этот трюк подойдёт в большинстве случаев.#!/bin/bash # неправильно for x in $*; do echo "parameter: '$x'" done
$ ./myscript 'arg 1' arg2 arg3 parameter: 'arg' parameter: '1' parameter: 'arg2' parameter: 'arg3'
#!/bin/bash
# правильно!
for x in "$@"; do
echo "parameter: '$x'"
done$ ./myscript 'arg 1' arg2 arg3 parameter: 'arg 1' parameter: 'arg2' parameter: 'arg3'
function со скобками (), определяя функцию.function, и (), но ни в одной другой оболочке так делать нельзя. Некоторые интерпретаторы, правда, воспримут function foo, но для максимальной совместимости лучше использовать:foo() {
...
}echo выведет ~ в stdout, вместо того, чтобы вывести пользовательский домашний каталог.$HOME вместо ~."~/dir with spaces" # "~/dir with spaces" ~"/dir with spaces" # "~/dir with spaces" ~/"dir with spaces" # "/home/my photos/dir with spaces" "$HOME/dir with spaces" # "/home/my photos/dir with spaces"
local сама работает как команда. Иногда это может непонятным образом взаимодействовать с остатком строки. Например, если в следующей команде вы хотите получить код возврата ($?) подставленной команды, вы его не получите: код возврата команды local его перекрывает.local varname varname=$(command) rc=$?
Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.
комментарии (7)