Правильный синтаксис:
7z a isos.7z *.iso
или
7z a isos.7z chakra-2015.11-fermi-x86_64.iso openSUSE-Leap-42.1-DVD-x86_64.iso PCBSD10.2-RELEASE-08-19-2015-x64-DVD-USB.iso Sabayon_Linux_15.11_amd64_MATE.iso
-121--209644-
Длина пароля в диалоговом окне учетной записи пользователя всегда показывает пять точек (• • • •) независимо от фактической длины пароля . В противном случае, это будет утечка информации, что (теоретически) облегчит злоумышленнику грубую силу или иным образом угадает ваш пароль.
Обратите внимание, что команда su
ищет пароль root . Если вы настроили свою учетную запись в качестве администратора, вы можете даже не установить ее во время установки. В этом случае используйте sudo
, который даст доступ в корневом эквиваленте с использованием собственного пароля.
-121--202520-
grep -n '^include ' yourfile |
sed -e 's/:[^ ]* /{ r /' \
-e 'G;s/.$/&b&}/' |
sed -nf - -ep yourfile
, которые должны работать. grep
находит те , которые включают в себя номера строк, первый sed
изменяет свой вывод на специфичные для номера строки команды [num] {r fname\nb\n}
, а второй sed
p
печатает каждую строку, которая не является одним из первых скриптов для него.
{ for x in a b
do echo "do $x">"file$x.xyz"
echo "include file$x.xyz"
done; printf "do %s\n" c d
} >yourfile
cat yourfile
include filea.xyz
include fileb.xyz
do c
do d
Создается образец и отображается файл .
И это работает:
grep -n '^include ' yourfile |
sed -e 's/:[^ ]* /{ r /' \
-e 'G;s/.$/&b&}/' |
sed -nf - -ep yourfile
do a
do b
do c
do d
файлы ead r
могут быть любого размера, хотя, конечно, и не ограничиваются одной строкой. Однако сами имена файлов ограничены одной строкой, но в остальном они являются более или менее неограниченными (в зависимости от вашего sed
- некоторые старые seds
имели произвольные ограничения длины имени, но большинство используемых сегодня не имеют) .
Код в вопросе работает, то есть он выполнит оператор exit 0
.
Ваш
STATUS=`echo "test"`
совпадает с
STATUS="test"
и (в данном случае )как
STATUS=test
т.е. переменной STATUS
присваивается test
значение (в значении )нет двойных кавычек.
Чтобы проверить это на значении test
, выполните
if [ "$STATUS" = "test" ]
или
if [[ $STATUS == "test" ]]
Если STATUS
имеет значение "test"
, как в
STATUS='"test"'
затем используйте эту строку в сравнении:
if [ "$STATUS" = '"test"' ]
или
if [[ $STATUS == '"test"' ]]
См. также:
Решение этой проблемы может отличаться в зависимости от того, какую оболочку вы используете. Кроме того, убедитесь, что $STATUS содержит «тест» перед сравнением со строкой «echo $STATUS» в вашем скрипте. Проверка содержимого переменных очень полезна для отладки. Хотя маловероятно, есть небольшой шанс, что какая-то другая программа устанавливает его, и в этом случае он явно не сработает.
Вообще говоря, написанный вами код ДОЛЖЕН работать. Если это не проблема, возможно, проблема связана с каким-либо другим кодом в сценарии, самой оболочкой или какой-либо другой программой. Вы можете попробовать экспортировать системную переменную с помощью экспорта, чтобы убедиться, что она установлена правильно. Это должно переопределить любые мешающие значения. Имейте в виду, что если другая программа мешает работе, ей может не понравиться изменение ее переменных.
В качестве справки приведу следующую информацию:
Лучший способ установить переменную в простое состояние, такое как «тест», это просто:
VARIABLE="value"
Хотя вы можете использовать эхо для возврата текста в переменную, для таких строк, как test, в этом нет необходимости. Если вы не собираетесь вставлять управляющие символы, такие как перевод строки, с помощью команды echo -e или printf.
Рекомендуемый способ сравнения строки — любой из этих:
if [ "$VARIABLE" = "value" ]; then
if [[ $VARIABLE == value ]]; then
Если вы еще не пробовали его, попробуйте использовать более новый [[, также известный как расширенный тест, вместо [, также известный как классический тест.
http://wiki.bash-hackers.org/commands/classictest
http://wiki.bash-hackers.org/syntax/ccmd/conditional_expression
Это отличные ресурсы, которые помогут вам получить дополнительную информацию, если вы хотите узнать все подробности об операторах тестирования.
Эти экранированные кавычки в \"test\"
наводят меня на мысль, что есть некоторая путаница в правилах цитирования оболочки, потому что первая часть кода работает так, как предполагалось, и $STATUS == \"test\"
не должна (, если вы не написали STATUS=`echo '"test"'`
или нечто подобное ).
Чтобы должным образом прояснить эту путаницу, необходимо объяснить некоторые концепции оболочки.
В оболочках POSIX заключение в кавычки является одним из наиболее важных механизмов. К сожалению, это также очень запутанная тема и при неправильном использовании является большим источником ошибок и странного поведения в скриптах.
Основные правила следующие:
\
:Сохраняет буквальное значение следующего за ним символа, за исключением <newline>
. "
:Сохраняет буквальное значение всех символов в кавычках, за исключением $
, `
, \
и, когда расширение истории включено, !
. '
:Сохраняет буквальное значение всех символов в кавычках без исключений. Подстановка команд позволяет выводу команды заменить саму команду. Его синтаксис либо $(command)
, либо `command`
, хотя первый предпочтительнее.
Команда test
(, также известная как [
в POSIX и [[
в таких оболочках, как bash, ksh и zsh ), позволяет использовать множество полезных условных и арифметических выражений. Например, он может проверить, существует ли данный обычный файл и доступен ли он для чтения, равны ли две строки или больше ли число, чем другое.
Итак,анализ кода:
STATUS=`echo "test"`
Подстановка команды здесь бесполезна, так как ее можно было бы записать как STATUS="test"
. Обратите внимание, что echo
не печатает двойные кавычки, поэтому STATUS
содержит test
в качестве своего значения.
if [ $STATUS == "test" ]; then
exit 0
fi
Вот как минимум 3 потенциальных недостатка:
$STATUS
без кавычек может быть затронуто разделением слов. ==
не является синтаксисом -POSIX. Используйте =
, если вам важна портативность. if
и exit 0
бесполезны в этом сценарии, так как [
уже выполняет намеченную работу. Кроме того, обратите внимание, что, как и в предыдущей строке кода, двойные кавычки не воспринимаются буквально, поэтому результирующая команда (после раскрытия и удаления кавычек )будет [ test = test ]
, что верно.
Но если вашей целью было получить "test"
в качестве значения STATUS
, тогда
STATUS=\"test\"
STATUS="\"test\""
STATUS='"test"'
— все допустимые назначения, а
[ "$STATUS" = \"test\" ]
[ "$STATUS" = "\"test\"" ]
[ "$STATUS" = '"test"' ]
являются допустимыми условными выражениями.